2016-10-21 2 views
1

Я пытаюсь выбрать элементы DOM в переменной Tampermonkey, используя GM_setValue, для последующей инъекции на разные страницы.Что делает Greasemonkey/Tampermonkey для моего объекта jQuery, когда я использую GM_setValue?

Я создал пример, где я могу сделать это в обычном jQuery, используя .clone(), но когда я устанавливаю его как значение в Tampermonkey, он изменяет значение сохраненной переменной.

Вот HTML страницу, чтобы проверить скрипт на:

<!DOCTYPE html> 
<html><head> 
<script data-require="[email protected]*" data-semver="3.0.0" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js"></script> 
<link rel="stylesheet" href="style.css"/> 
<style> 
    div { 
     border: solid 1px black; 
     margin: 5px; 
     padding: 5px; 
    } 
</style> 
</head> 
<body> 
    <!-- these buttons controlled by grease monkey--> 
    <div> 
     GreaseMonkey <button id="copy"> save</button> 
     <button id="paste"> paste </button> 
    </div> 
    <div> 
     Local <button id="copyLocal"> save</button> 
     <button id="pasteLocal"> paste </button> 
    </div> 
    <div id="bar"> hello world </div> 
    <script> 
     var ele; 
     $("#copyLocal").click(function() { 
      console.log("copy"); 
      ele = $("#bar").clone(); 
      console.log(ele); 
     }); 
     $("#pasteLocal").click(function(){ 
      console.log("paste"); 
      console.log(ele); 
      $("body").append(ele); 
     }); 
    </script> 
</body> 
</html> 

А вот соответствующий Tampermonkey/Greasemonkey скрипт:

// ==UserScript== 
// @name   New Userscript 
// @namespace http://tampermonkey.net/ 
// @version  0.1 
// @description try to take over the world! 
// @author  You 
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js 
// @match  file:///C:/david/sandbox/jquery/index.html 
// @grant  GM_setValue 
// @grant GM_getValue 
// ==/UserScript== 

(function() { 
    'use strict'; 

    $(document).ready(function() { 
     $("#copy").click(function() { 
     console.log("copy"); 

      var ele = $("#bar").clone(); 
      console.log(ele); 
     GM_setValue("ele", ele); 
    }); 

    $("#paste").click(function(){ 
     console.log("paste"); 

     var ele = GM_getValue("ele"); 
     console.log(ele); 
     $("body").append(ele); 
    }); 

     console.log("ready"); 
    }); 
})(); 

Вот консольный вывод:

enter image description here

Как вы можете видеть - Tampermonkey (я также попробовал это с помощью Greasemonkey), похоже, удаляет jQuery из объекта jQuery.

ответ

2

GM_setValue()only works on: strings, (some) integers and booleans.

В вашем коде ele находится объект.
Теперь для простых объектов, вы можете GM_setValue их с помощью первого JSON, кодирующего их. НО ваш объект является сложным объектом jQuery, и они не могут быть закодированы JSON. (Когда-the attempt would throw a JS error. В настоящее время, JSON.stringify просто опустить все проблемные свойства, оставив вас без вещи вам нужно больше всего.)

Вопрос показывает вы, видимо, просто клонировать HTML. Если это правда, вам не нужно пытаться хранить объект jQuery. Просто сохраните HTML.

Что-то вроде этого:

// ==UserScript== 
// @name New Userscript 
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js 
// @match file:///C:/david/sandbox/jquery/index.html 
// @grant GM_setValue 
// @grant GM_getValue 
// ==/UserScript== 

$("#copy").click (function() { 
    console.log ("copy"); 

    var ele = $("#bar").html(); 
    console.log (ele); 
    GM_setValue ("ele", ele); 
}); 

$("#paste").click (function() { 
    console.log ("paste"); 

    var ele = GM_getValue ("ele"); 
    console.log (ele); 
    $("body").append (ele); 
}); 

console.log ("ready"); 

PS: Оберточная хлама я пропустил это материал, который вы почти никогда не нужно в скрипте GM/TM.

+0

Привет - спасибо за ответ. К сожалению, это не работает для того, что я на самом деле пытаюсь сделать, а именно для привязки данных к моим элементам DOM и сохранения их состояния. Вместо этого я рассмотрю использование файлов cookie. – dwjohnston

+1

Вы все равно можете привязывать данные. Просто не используйте '.data()' jQuery. Использовать атрибуты данных; таким образом данные хранятся в HTML и, таким образом, 'GM_setValue'. Возможно, вам придется сначала закодировать JSON свои данные. ... Наконец, не используйте файлы cookie. Они отправляются на сервер и кажутся откинутыми (по причинам). Если вы идете по этому маршруту, вместо этого используйте 'localStorage'. –

Смежные вопросы