ক্রোম এক্সটেনশান কীভাবে পপআপ এইচটিএমএলে সামগ্রী স্ক্রিপ্ট থেকে ডেটা প্রেরণ করা যায়


97

আমি জানি এটি অসংখ্য পোস্টে জিজ্ঞাসা করা হয়েছিল তবে সত্যই আমি সেগুলি পাই না। আমি জাভাস্ক্রিপ্ট, ক্রোম এক্সটেনশান এবং সবকিছুতে নতুন এবং আমার এই ক্লাসের দায়িত্ব রয়েছে। সুতরাং আমার এমন একটি প্লাগইন তৈরি করা দরকার যা ক্রস ডোমেন অনুরোধগুলি ব্যবহার করে যে কোনও পৃষ্ঠায় DOM অবজেক্টগুলি গণনা করবে। আমি এখনও পর্যন্ত Chrome এক্সটেনশন এপিআই ব্যবহার করে এটি অর্জন করতে সক্ষম হয়েছি। এখন সমস্যাটি হ'ল আমার পপআপ এইচটিএমএল পৃষ্ঠায় কন্টেন্টসস্ক্রিপ্ট.জেএস ফাইল থেকে ডেটা প্রদর্শন করা দরকার। আমি কীভাবে করব তা আমি জানি না যে আমি ডকুমেন্টেশনগুলি পড়ার চেষ্টা করেছি কিন্তু ক্রোমে মেসেজিং আমি কী করতে হবে তা বুঝতে পারি না।

নিম্নলিখিত এখন পর্যন্ত কোড নিম্নলিখিত।

manifest.json

{
"manifest_version":2,

"name":"Dom Reader",
"description":"Counts Dom Objects",
"version":"1.0",

"page_action": {
    "default_icon":"icon.png",
    "default_title":"Dom Reader",
    "default_popup":"popup.html"
},

"background":{
    "scripts":["eventPage.js"],
    "persistent":false
},

"content_scripts":[
    {
        "matches":["http://pluralsight.com/training/Courses/*", "http://pluralsight.com/training/Authors/Details/*",                                          "https://www.youtube.com/user/*", "https://sites.google.com/site/*", "http://127.0.0.1:3667/popup.html"],
        "js":["domReader_cs.js","jquery-1.10.2.js"]
        //"css":["pluralsight_cs.css"]
    }
],

"permissions":[
    "tabs",
    "http://pluralsight.com/*",
    "http://youtube.com/*",
    "https://sites.google.com/*",
    "http://127.0.0.1:3667/*"
]

popup.html

<!doctype html>
<html>

    <title> Dom Reader </title>    
    <script src="jquery-1.10.2.js" type="text/javascript"></script>
    <script src="popup.js" type="text/javascript"></script>

<body>
    <H1> Dom Reader </H1>
    <input type="submit" id="readDom" value="Read DOM Objects" />

   <div id="domInfo">

    </div>
</body>
</html>

ইভেন্টপেজ.জেএস

var value1,value2,value3;

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
if (request.action == "show") {
    chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
        chrome.pageAction.show(tabs[0].id);
    });
}

value1 = request.tElements;
});

popup.js

$(function (){
$('#readDom').click(function(){
chrome.tabs.query({active: true, currentWindow: true}, function (tabs){
    chrome.tabs.sendMessage(tabs[0].id, {action: "readDom"});

 });
});
});

কন্টেন্টস্ক্রিপ্ট

var totalElements;
var inputFields;
var buttonElement;

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse){
if(request.action == "readDom"){

    totalElements = $("*").length;
    inputFields = $("input").length;
    buttonElement = $("button").length;


}
})

chrome.runtime.sendMessage({ 
action: "show", 
tElements: totalElements, 
Ifields: inputFields, 
bElements: buttonElement 

});

যে কোনও সহায়তা প্রশংসা করা হবে এবং দয়া করে আমি যে কোনও দুষ্টুতা এড়াতে হবে :)

উত্তর:


175

যদিও আপনি অবশ্যই সঠিক পথে আছেন (এবং আসলে শেষের খুব কাছাকাছি), আপনার কোডে বেশ কয়েকটি (ইমো) খারাপ অভ্যাস রয়েছে (যেমন একটি তুচ্ছ কাজের জন্য একটি সম্পূর্ণ লাইব্রেরি (জ্যাকেই)) ইনজেকশন করা, অপ্রয়োজনীয় অনুমতিগুলি ঘোষণা করা, অতিমানবীয় করা এপিআই পদ্ধতি ইত্যাদিতে কল করে)।
আমি নিজের কোডটি নিজেই পরীক্ষা করে দেখিনি, তবে একটি দ্রুত পর্যালোচনা থেকে আমি বিশ্বাস করি যে নিম্নলিখিতটি সংশোধন করার ফলে একটি কার্যনির্বাহী সমাধান হতে পারে (যদিও একেবারে অনুকূলের খুব কাছাকাছি নয়):

  1. ইন manifest.json টি : পরিবর্তনের বিষয়বস্তু স্ক্রিপ্ট ক্রম, প্রথম jQuery নির্বাণ। সম্পর্কিত ডক্স অনুসারে :

    "js" [...] জাভাস্ক্রিপ্ট ফাইলগুলির তালিকার সাথে মিলে যাওয়া পৃষ্ঠাগুলিতে ইনজেকশনের প্রয়োজন। এগুলি যাতে এই অ্যারেটিতে প্রদর্শিত হয় সেগুলিতে এটি ইনজেকশন দেওয়া হয়

    (জোর আমার)

  2. ইন contentscript.js : সরান chrome.runtime.sendMessage ({...}) ব্লক ভিতরেonMessage শ্রোতা কলব্যাক।


বলেছিল, এখানে আমার প্রস্তাবিত পদ্ধতিটি:

নিয়ন্ত্রণ প্রবাহ:

  1. একটি সামগ্রীর স্ক্রিপ্ট কিছু মানদণ্ডের সাথে মিলিয়ে প্রতিটি পৃষ্ঠায় ইনজেক্ট করা হয়।
  2. একবার ইনজেকশনের পরে বিষয়বস্তু স্ক্রিপ্টগুলি ইভেন্ট পৃষ্ঠায় (ওরফে অ-অবিচলিত ব্যাকগ্রাউন্ড পৃষ্ঠা) একটি বার্তা প্রেরণ করে এবং ইভেন্ট পৃষ্ঠাটি ট্যাবে একটি পৃষ্ঠা-ক্রিয়া সংযুক্ত করে।
  3. পৃষ্ঠা-অ্যাকশন পপআপটি লোড হওয়ার সাথে সাথে এটি সামগ্রীটির স্ক্রিপ্টে একটি বার্তা প্রেরণ করে এটির প্রয়োজনীয় তথ্য জিজ্ঞাসা করে।
  4. সামগ্রী স্ক্রিপ্ট অনুরোধটি প্রসেস করে এবং প্রতিক্রিয়া জানায় যাতে পৃষ্ঠা-ক্রিয়া পপআপ তথ্য প্রদর্শন করতে পারে।

ডিরেক্টরি কাঠামো:

          root-directory/
           |_____img
                 |_____icon19.png
                 |_____icon38.png
           |_____manifest.json
           |_____background.js
           |_____content.js
           |_____popup.js
           |_____popup.html

manifest.json:

{
  "manifest_version": 2,
  "name": "Test Extension",
  "version": "0.0",
  "offline_enabled": true,

  "background": {
    "persistent": false,
    "scripts": ["background.js"]
  },

  "content_scripts": [{
    "matches": ["*://*.stackoverflow.com/*"],
    "js": ["content.js"],
    "run_at": "document_idle",
    "all_frames": false
  }],

  "page_action": {
    "default_title": "Test Extension",
    //"default_icon": {
    //  "19": "img/icon19.png",
    //  "38": "img/icon38.png"
    //},
    "default_popup": "popup.html"
  }

  // No special permissions required...
  //"permissions": []
}

পটভূমি.জেএস:

chrome.runtime.onMessage.addListener((msg, sender) => {
  // First, validate the message's structure.
  if ((msg.from === 'content') && (msg.subject === 'showPageAction')) {
    // Enable the page-action for the requesting tab.
    chrome.pageAction.show(sender.tab.id);
  }
});

সামগ্রী.js:

// Inform the background page that 
// this tab should have a page-action.
chrome.runtime.sendMessage({
  from: 'content',
  subject: 'showPageAction',
});

// Listen for messages from the popup.
chrome.runtime.onMessage.addListener((msg, sender, response) => {
  // First, validate the message's structure.
  if ((msg.from === 'popup') && (msg.subject === 'DOMInfo')) {
    // Collect the necessary data. 
    // (For your specific requirements `document.querySelectorAll(...)`
    //  should be equivalent to jquery's `$(...)`.)
    var domInfo = {
      total: document.querySelectorAll('*').length,
      inputs: document.querySelectorAll('input').length,
      buttons: document.querySelectorAll('button').length,
    };

    // Directly respond to the sender (popup), 
    // through the specified callback.
    response(domInfo);
  }
});

পপআপ.জেএস:

// Update the relevant fields with the new data.
const setDOMInfo = info => {
  document.getElementById('total').textContent = info.total;
  document.getElementById('inputs').textContent = info.inputs;
  document.getElementById('buttons').textContent = info.buttons;
};

// Once the DOM is ready...
window.addEventListener('DOMContentLoaded', () => {
  // ...query for the active tab...
  chrome.tabs.query({
    active: true,
    currentWindow: true
  }, tabs => {
    // ...and send a request for the DOM info...
    chrome.tabs.sendMessage(
        tabs[0].id,
        {from: 'popup', subject: 'DOMInfo'},
        // ...also specifying a callback to be called 
        //    from the receiving end (content script).
        setDOMInfo);
  });
});

পপআপ এইচটিএমএল:

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="popup.js"></script>
  </head>
  <body>
    <h3 style="font-weight:bold; text-align:center;">DOM Info</h3>
    <table border="1" cellpadding="3" style="border-collapse:collapse;">
      <tr>
        <td nowrap>Total number of elements:</td>
        <td align="right"><span id="total">N/A</span></td>
      </tr>
      <tr>
        <td nowrap>Number of input elements:</td>
        <td align="right"><span id="inputs">N/A</span></td>
      </tr>
      <tr>
        <td nowrap>Number of button elements:</td>
        <td align="right"><span id="buttons">N/A</span></td>
      </tr>
    </table>
  </body>
</html>

কি দারুন ! ধন্যবাদ ভাই, আপনার এপ্রোচটি এখন যাচাই করে নিচ্ছি আমি আমার কোড দিয়ে কতটা সমস্যা তৈরি করেছি। ধন্যবাদ প্রচুর এটি একটি কবজ মত কাজ করে। :)
সুমির বালুচ

হ্যালো, দুঃখিত আমি কিছুদিন ধরে নেই, আপনার মন্তব্যটি পরীক্ষা করে দেখলাম। আমি কোন উত্তর গ্রহণ করতে পারি না। এটি বলছে যে এটি করার জন্য আপনার 15 খ্যাতি পয়েন্ট দরকার।
সুমির বালুচ

আপনি কি আমাকে খুব অনুরূপ সমস্যা সমাধানে সহায়তা করতে আপত্তি করবেন? <a href=" stackoverflow.com/questions/34467627/…> এই মুহুর্তে আমার বর্তমান শটটি আপনার উত্তরটি থেকে বেশিরভাগ কোড। তবে আমি এখনও এটি কাজ করতে পারি না এবং এই বিষয়ে কোনও ভাল সহায়তা খুঁজে পাওয়া যায় না বলে মনে হয়
wuno

কেন তুমি ব্যবহৃত chrome.tabs.sendMessagepopupjs এবং chrome.runtime.onMessage.addListenerকেন content.js মধ্যে .tabspopupjs এবং .runtimecontent.js মধ্যে
হাবিব Kazemi

4
@ এইচকেমি: কারণ আপনি বার্তা প্রেরণ এবং গ্রহণ করেন। সবই ডক্সে
gklpak

7

আপনি এর জন্য লোকালস্টোরেশন ব্যবহার করতে পারেন। আপনি ব্রাশ মেমরিতে হ্যাশ টেবিল বিন্যাসে যে কোনও ডেটা সঞ্চয় করতে পারেন এবং তারপরে যেকোন সময় অ্যাক্সেস করতে পারেন। আমি নিশ্চিত না যে আমরা কন্টেন্ট স্ক্রিপ্ট থেকে লোকাল স্টোরেজ অ্যাক্সেস করতে পারি (এটি আগে অবরুদ্ধ করা হয়েছিল), নিজে থেকে করার চেষ্টা করুন। আপনার ব্যাকগ্রাউন্ড পৃষ্ঠার মাধ্যমে এটি কীভাবে করবেন তা এখানে রয়েছে (আমি প্রথমে সামগ্রী লিপি থেকে ব্যাকগ্রাউন্ড পৃষ্ঠায় ডেটা পাস করি, তারপরে এটিকে লোকাল স্টোরেজে সংরক্ষণ করুন):

কন্টেন্টস্ক্রিপ্ট.জেজে:

chrome.runtime.sendMessage({
  total_elements: totalElements // or whatever you want to send
});

ইভেন্টপেজ.জেজে (আপনার পটভূমি পৃষ্ঠা):

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse){
       localStorage["total_elements"] = request.total_elements;
    }
);

তারপরে আপনি লোকালস্টোরেজ ["টোটাল_ এলিমেন্টস]] এর সাথে পপআপ.জেজে যে পরিবর্তনশীলটি অ্যাক্সেস করতে পারেন।

সম্ভবত আপনি আধুনিক ব্রাউজারগুলির সামগ্রীর স্ক্রিপ্ট থেকে লোকালস্টোরেশন অ্যাক্সেস করতে পারেন। তারপরে আপনার পটভূমির পৃষ্ঠায় ডেটা পাস করার দরকার নেই।

লোকালস্টোরেজ সম্পর্কে ভাল পঠন: http://diveintohtml5.info/stores.html


4
অনুগ্রহ করে, হ্রাসপ্রাপ্ত ক্রোম.এক্সটেনশন.অনরেকুয়েস্ট / সেন্ডেরেক্সেস্টের ব্যবহার প্রচার করবেন না (যা কার্যকর করার আগে বিটিডব্লিউ একটি অ-স্থায়ী পটভূমি পৃষ্ঠা লোড করে না)। ব্যবহার করুন chrome.runtime। * পরিবর্তে।
gklpak

4
@ এক্সপার্ট সিস্টেম দয়া করে, আপনি যদি এই ধরণের পুরানো তথ্য দেখতে পান তবে একটি সম্পাদনা করার পরামর্শ দিন / করুন।
Xan

4
@ এক্সান: সুতরাং, আপনি [গুগল-ক্রোম-এক্সটেনশন] এর উত্তরসূরী :) :) আমি মানুষের পোস্টগুলি সম্পাদনা করতে পছন্দ করি না (এটি আমি খুব চটজলদি বলে মনে করি)। এছাড়াও, বহু পুরানো টিউটোরিয়াল এবং উদাহরণ সহ (কমপক্ষে ততক্ষণে ফিরে), আমি সঠিক উপায়টি প্রদর্শন করার পরিবর্তে (কেননা কিছু লোক এটি "হিসাবে ভাবতে পারে" তার পরিবর্তে কেন এটি ব্যবহার করা খারাপ তা সম্পর্কে একটি স্পষ্ট মন্তব্য দেওয়া ভাল ছিল found .extension.xxxসমানভাবে ঠিক আছে বিকল্প))। আমার ধারণা এটি আরও শৈলীর বিষয়। ভাল কাজগুলো করতে থাকো !
gklpak
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.