2016-04-25 10 views
0

Я разрабатываю простое расширение Chrome, которое что-то делает, когда поле ввода пароля сфокусировано. Я использую следующий сценарий содержимого для достижения того же (код упрощен для запроса этого вопроса). Код не работает на таких страницах, как https://accounts.google.com/, но он отлично работает для таких страниц, как https://www.linkedin.com/. Это из-за некоторых конфликтов Javascript/JQuery? Или какая-то другая причина? Пожалуйста помоги. Я пробовал использовать noConflict api, но это не помогло.Скрипт содержимого расширения Google Chrome не работает на нескольких страницах

Содержание сценария:

var inputs = document.getElementsByTagName('input'); 
function foo() { 
    for (var i = 0; i < inputs.length; i++) { 
     if (inputs[i].type.toLowerCase() == 'password') 
      inputs[i].addEventListener("focus", bar); 
    } 
} 

function bar() { 
    alert(1); 
} 

foo(); 

Над сценарием находит элементы ввода паролей типа, но не добавляет прослушиватель событий.

Manifest:

{ 
    "manifest_version": 2, 
    "name": "MyExtension", 
    "version": "1.0", 
    "options_page": "options.html", 
    "browser_action": { 
     "default_icon": "img/abcd.png", 
     "default_title": "MyExtension", 
     "default_popup": "popup.html" 
    },"icons": { "16": "img/abcd16.png", 
      "48": "img/abcd48.png", 
      "128": "img/abcd128.png" },"description":"abcd abcd", 
    "permissions": [ 
     "storage","tabs" 
    ], 
    "content_scripts": [ 
     { 
      "matches": ["<all_urls>" 
      ], 
      "js":  ["js/content.js","js/jquery.1.8.3.min.js"], 
      "css": ["css/style.css"], 
      "run_at": "document_end", 
      "all_frames": true 
     } 
    ],"web_accessible_resources": [ 
    "img/*.png", 
    "css/*.css" 
    ] 
} 
+0

Не могли бы вы также предоставить свой 'manifest.json'? Если вы объявляете 'google' в поле' matches', код выше должен работать хорошо. –

+0

Я объявил в поле матчей. Я должен работать нормально? Его работа для сайтов, таких как linkedin или twitter! –

+0

На самом деле я просто тестировал его на своем конце, он также хорошо работает для google, если есть ввод пароля. –

ответ

1

Рассматривали ли вы, что поле ввода вы ищете, не существует к тому времени, что скрипт выполняет? https://accounts.google.com/ - это динамическая форма, поле пароля создается после загрузки страницы (document_end) и поэтому долго после того, как вы соберете inputs.

В дополнение к привязке обработчика к существующим элементам вам необходимо следить за добавлением новых. Я бы предложил использовать mutation-summary library с запросом {element: "input[type=password]"}, но если вы не хотите привлекать библиотеку, основной строительный блок, на который нужно смотреть, это MutationObserver.

+0

Автор сказал, что нашел входные данные, но фокусное событие не срабатывает. –

+0

Я не уверен. Код, который он отправил, не нашел их. И отладка «упрощенного кода» может быть бессмысленной (возможно, нет, возможно, это правильный MCVE). – Xan

+0

Это, вероятно, помогает Xan! Поскольку все веб-сайты, на которых работает, у них есть поле пароля во время загрузки страницы. Хотя, в Google, мой код может найти пароль ввода с id Passwd-скрытым! Но он отображается пользователю динамически. –