2012-02-04 2 views
0

Для моего проекта я создаю букмарклет, который дает пользователям параметры тегов. Я передаю массив из верхних тегов пользователя и зацикливаюсь в javascript для генерации всех параметров.Bookmarklet Javascript Array Leak?

Проблема заключается в том, что массив собирает функции изгоев из базовой страницы, которые каким-то образом превращают ее в массив, и, как вы можете видеть на изображении ниже: прикручивать все.

Я попытался вручную удалить их, сняв блоки по длине строки, но я обнаружил, что в некоторых случаях (как и в случае журнальных журнальных статей) функции-изгои имеют открытый скриптовый тег, который я удаляю и тем самым нарушая букмарклет.

Вот код, где я строю яваскрипта массив:

<?php foreach ($default_aspects as $aspect_id => $aspect_display) { ?> 
    default_aspects['<?php echo $aspect_id; ?>'] = '<?php echo $aspect_display; ?>'; 
<?php } ?> 

А вот код, где я печатаю массив из:

html += '<div id="bml_category___" style="display:none; opacity:0;">'; 
    for (var i in default_aspects) { 
    html += '<div class="bml_category_block___">' + default_aspects[i] + '</div>'; 
    }; 

Вы можете увидеть, как это выглядит (и проблема) здесь: http://cl.ly/0W1Y0B0U1S210L1h2y2n

У меня есть какая-то утечка?

ответ

1

Эта страница, вероятно, использует фреймворк JavaScript, который изменяет собственные объекты. Используйте метод hasOwnProperty, чтобы отфильтровать эти методы.

Я использую Object.hasOwnProperty.call(default_aspects, i) вместо default_aspects.hasOwnProperty(i), чтобы убедиться, что свойство с именем hasOwnProperty не нарушает ваш код.

html += '<div id="bml_category___" style="display:none; opacity:0;">'; 
for (var i in default_aspects) { 
    if (Object.hasOwnProperty.call(default_aspects, i)) { 
     html += '<div class="bml_category_block___">' + default_aspects[i] + '</div>'; 
    } 
}; 

Если у вас есть современный браузер, то проще использовать Object.keys():

var keys = Object.keys(default_aspects); 
for (var i=0; i<keys.length; i++) { 
    html += '<div class="bml_category_block___">' + default_aspects[i] + '</div>' 
} 

Или, используя Array.forEach:

Object.keys(default_aspects).forEach(function(key) { 
    html += '<div class="bml_category_block___">' + default_aspects[key] + '</div>' 
}); 
+0

Благодаря Роб! Я закончил читать эту статью, http://www.quirksmode.org/js/associative.html, а затем просто создал свой собственный объект вместо того, чтобы столкнуться с конфликтующими расширениями объекта Array. Большое спасибо! – jeffhuber

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

  • Нет связанных вопросов^_^