Букмарклет Javascript Array Leak? - PullRequest
       2

Букмарклет Javascript Array Leak?

0 голосов
/ 04 февраля 2012

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

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

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

Вот код, в котором я строю массив javascript:

<?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 Ответ

1 голос
/ 04 февраля 2012

Эта страница, вероятно, использует 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>'
});
...