Должен ли jquery.data() работать в скриптах Greasemonkey?
-
22-07-2019 - |
Вопрос
Я использую jquery в пользовательском скрипте greasemonkey.Я пытаюсь добавить кучу опций в select на основе массива, а также вставить соответствующий объект в элемент с помощью jquery.данные, подобные этому:
$.each(some_array, function(item){
// These next 2 statements seem awkward to me and I was also hoping
// a jquery master could show me a slicker way to perhaps
// combine them into something simpler
$('select').append('<option>dummy</option>');
$('select option:last-child').data('obj', item);
});
Затем я хотел бы вернуть объект при выделении:
$('select').change(function(){
var theObj = $('option:selected', this).data('obj');
});
Однако в моем пользовательском скрипте greasemonkey значение theObj не определено.Я знаю, что происходит какая-то обезьянья возня с обертками, unsafeWindow и т.д.Я просто надеялся, что кто-нибудь знает, из-за чего именно это не работает.
Решение 2
Я обнаружил, что все, что мне нужно, чтобы заставить его работать, это:
$.each(some_array, function(item){
$('select').append('<option>dummy</option>');
$('select option:last-child').each(function(index, elem){
$(elem.wrappedJSObject).data('obj', item);
});
});
$('select').change(function(){
var theObj = $('option:selected', this.wrappedJSObject).data('obj');
});
Все это связано с XPCNativeWrappers . Я не уверен, где в коде jquery он использовал код, который не будет работать с этими обертками (я посмотрел немного, но не слишком сложно). Это определенно представляет большую проблему безопасности, поэтому я бы не стал вкладывать это во что-то важное. Р>
Другие советы
Значение OBJ должно быть неопределенным, если не выбран последний параметр первого поля выбора на странице, поскольку данные были добавлены только ко всем последним параметрам в любом поле выбора, но были получены для первого выбранного параметра на странице.
Просто в качестве руководства по стилю вам следует чаще использовать "это".например ,
$('select').change(function(){
var theObj = $('select option:selected').data('obj');
});
должно быть:
$('select').change(function(){
var theObj = $('option:selected',this).data('obj');
});
или
$('select').change(function(){
var theObj = $(this).find('option:selected').data('obj');
});
Возможно, я не очень хорошо понимаю вопрос, но я дам ответ.
Вы можете перебирать массив, и при этом использовать этот объект. Вот пример
var array_items = [0,1,2,3,4,5];
$.each(array_items, function(item) {
$('select').append('<option>dummy</option>');
$('select option:last-child').data('obj', item);
});
Трудно точно сказать, что такое "список" в вашем вопросе.