-1

私の拡張機能では、を使用して Web ページの HTML コンテンツを複製しています$.html()<select>ただし、これを行うと、要素などの一部の値が失われます。この問題を解決するために、Web ページの各要素に一意の ID を指定し、HTML コンテンツを取得して、その HTML コンテンツで値を正しく設定しようとしました。しかし、それはうまくいきませんでした。コード スニペットは次のとおりです。

$( function() 
{ 
    $('*').each( function(i) 
    { 
        $(this).attr('uid', i);
    }); 
});

var html_data = $("html").html();
$("option:selected", html_data).removeAttr("selected");
var all_selected = $("option:selected");
for (var i = 0; i < all_selected.length; i++) 
{
    var uid = $(all_selected[i]).attr("uid");
    $("[uid="+uid+"]", html_data).attr("selected", true)
} 

問題は、「$("option:selected", html_data).removeAttr("selected");」を実行すると、「選択済み」が削除された要素が返されるが、元の html_data は変更されないことです。html_data は読み取り専用のようです。また、これらのタグを から返されたタグに置き換えようとしました.removeAttr("selected")。しかし、それもうまくいきませんでした。

これに対する解決策はありますか?

更新: 最初の回答から、混乱があるようです。それを明確にしてみましょう:

  • 「選択した」値を Web ページで直接変更することはできません。
  • Web ページ全体を取得して、バックエンド制御ページ (background.js) に送信したいと考えています。
  • ただし、.html() を使用して Web ページ全体を取得してバックエンドに送信すると、選択した値が失われます。
4

1 に答える 1

0

これが私がこれを解決した方法です。

コンテンツ スクリプトのサイド コード:

//First, generate a unique id for each element                                                                  
$(function() { $('*').each(function(i) { $(this).attr('my_uid', i);}); });

//Once you send the page to the backend, all information such as whether the 
//element is rendered or not is lost. To retain that, add one more attribute to 
//each element                                                          
$(function() {
       $('*').each(function(i) {
         if ($(this).is(":visible")) {
              $(this).attr('final_rendering', "visible");
         }
         else {
              $(this).attr('final_rendering', "hidden");
         }
  });
});

//Collect all values that are lost in an object                  
var my_vals = {};
var input_elements = $(":input[type='text'], select");

for (var i = 0; i < input_elements.length; i++) {
     var uid = $(input_elements[i]).attr("my_uid");
     var val = $('[my_uid='+ uid +']').val();
     my_vals[uid] = val;
}

var html_page = $("html").html();
send_response({
    'html_page' : html_page,
    'my_vals'  :  my_vals
});

バックグラウンド スクリプト コード:

function get_html_page_cb(ret_val) {

   var html_page = ret_val['html_page'];
   var my_vals = ret_val['my_vals'];
   var html_doc_copy = document.implementation.createHTMLDocument("webpage");
   html_doc_copy.documentElement.innerHTML = html_page;

   for (var id in my_vals) {
      $("[my_uid="+id+"]",html_doc_copy).val(my_vals[id]);
   }
}

誰かがより良いアイデアを持っているなら、私はすべての耳です。

于 2013-07-23T18:32:20.487 に答える