Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.17.184.90] |
|
Сообщ.
#1
,
|
|
|
Пишу расширение для Хрома, для внутреннего использования.
Микрозадача: кликнуть одну из кнопок на странице левого сайта. Ее код: <button class="flat_button" onclick="return GroupsEdit.addBlacklist()">Добавить в чёрный список</button> Нужно ее как минимум идентифицировать среди более других. Класс у всех один, различается onclick и текст. На текст привязываться по очевидным причинам не хочу - могут быть разные локализации. А онклик не вытягивается var ABL = document.getElementsByClassName('flat_button'); console.log("Flat buttons:" + ABL.length); for (var i = 0; i < ABL.length; i++){ console.log("Button [" + i + "]"); console.log(ABL[i].innerText); if(ABL[i].onclick) console.log(ABL[i].onclick.toString()); if(ABL[i].onclick && ABL[i].onclick.toString() == "return GroupsEdit.addBlacklist()") ABL[i].click(); } } Если я вставляю свою кнопку перед этой: var btn = document.createElement('button'); btn.className = "flat_button"; btn.innerHTML = "Моя кнопочка"; btn.onclick = myAlert; var v = document.getElementsByClassName('page_block_header_extra _header_extra'); if(v.length == 1){ v[0].insertBefore(btn, null); } То для нее обработчик в предыдущем цикле логгируется. Цитата testloader.js:159 Flat buttons:2 testloader.js:161 Button [0] testloader.js:162 Добавить в чёрный список testloader.js:161 Button [1] testloader.js:162 Моя кнопочка testloader.js:163 function myAlert(){ alert("Some funny!"); } Что делать? |
Сообщ.
#2
,
|
|
|
И еще простой (наверное) вопрос.
Как тупо послать элементу нажатие клавиши??? <input type="text" class="ui_search_field _field" id="sb_search_b057d4b7" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Поиск по подписчикам"> Дебилы сделали старт поиска тупо по нажатию Enter в этом текстовом поле. Другим способом пока не вкурил как можно сделать. Слал клик - не реагирует, формы вокруг вообще нет - так что сабмит некому делать, метода созвучного с "нажать на кнопку" не вижу ни в классе элемента, ни ХТМЛэлемента, на в окне, ни в документе. Где???? |
Сообщ.
#3
,
|
|
|
Цитата barazuk @ на странице левого сайта а как твой скрипт привязан к "левому" document....? Цитата barazuk @ Нужно ее как минимум идентифицировать среди более других по родительским тегам, по соседним элементам, по расположению в document.getElementsByClassName('flat_button');, по цепочке всего дерева от body Цитата barazuk @ То для нее обработчик в предыдущем цикле логгируется не могу лог понять... что было нажато и кто такие document.getElementsByClassName('page_block_header_extra _header_extra'); ? Цитата barazuk @ Где???? раз ни формы ни onclick нету, тогда наверно слушатель событий покопать надо... Хотя нет, в тырнете ни чё такого не нашёл.. |
Сообщ.
#4
,
|
|
|
Цитата K313 @ а как твой скрипт привязан к "левому" document....? Как обычно, это же расширение Хрома. Скрипт подгружен на "чужую" страницу. Цитата K313 @ по родительским тегам, по соседним элементам Кнопки отличаются только текстом и обработчиком. Порядок и число их может меняться в зависимости от ситуации. Родительский элемент у всех один. А надо как-то различить, чтобы не то не кликнуть. Добавлено Цитата K313 @ не могу лог понять... что было нажато и кто такие document.getElementsByClassName('page_block_header_extra _header_extra'); ? Для ясности. Если так: var ABL = document.getElementsByClassName('flat_button'); console.log("Flat buttons:" + ABL.length); for (var i = 0; i < ABL.length; i++){ console.log("Button [" + i + "]"); console.log(ABL[i].innerText); if(ABL[i].onclick) console.log(ABL[i].onclick.toString()); if(ABL[i].onclick && ABL[i].onclick.toString() == "return GroupsEdit.addBlacklist()") ABL[i].click(); } } Лог выглядит так: Цитата testloader.js:159 Flat buttons:1 testloader.js:161 Button [0] testloader.js:162 Добавить в чёрный список Если я вставляю свою кнопку перед этой: var btn = document.createElement('button'); btn.className = "flat_button"; btn.innerHTML = "Моя кнопочка"; btn.onclick = myAlert; var v = document.getElementsByClassName('page_block_header_extra _header_extra'); if(v.length == 1){ v[0].insertBefore(btn, null); } var ABL = document.getElementsByClassName('flat_button'); console.log("Flat buttons:" + ABL.length); for (var i = 0; i < ABL.length; i++){ console.log("Button [" + i + "]"); console.log(ABL[i].innerText); if(ABL[i].onclick) console.log(ABL[i].onclick.toString()); if(ABL[i].onclick && ABL[i].onclick.toString() == "return GroupsEdit.addBlacklist()") ABL[i].click(); } } То лог такой (и обработчик выдирается): Цитата testloader.js:159 Flat buttons:2 testloader.js:161 Button [0] testloader.js:162 Добавить в чёрный список testloader.js:161 Button [1] testloader.js:162 Моя кнопочка testloader.js:163 function myAlert(){ alert("Some funny!"); } 'page_block_header_extra _header_extra' - родитель кнопки, к вопросу отношения не имеет, он находится легко. Судя по твоим вопросам, ты вообще в расширениях не шаришь? |
Сообщ.
#5
,
|
|
|
Цитата barazuk @ в расширениях наверно нет... Судя по твоим вопросам, ты вообще в расширениях не шаришь? v[0].insertBefore(btn, null); |
Сообщ.
#6
,
|
|
|
Цитата K313 @ попробуй вместо null задать элемент, перед которым хочешь вставить свою кнопку Зачем??? Кнопка итак вставляется куда надо. Ты вообще уловил, в чем проблема? |
Сообщ.
#7
,
|
|
|
Цитата barazuk @ действительно, зачем ?! это у меня заклинило просто Зачем??? Кнопка итак вставляется куда надо. Цитата barazuk @ Если я вставляю свою кнопку перед этой: Цитата barazuk @ думаю, идентифицировать нужную тебе кнопочку ( и вторая - не обрабатывается послка click на ту кнопочку ) Ты вообще уловил, в чем проблема? ну если так подумать то, не обрабатывается посылка click, может потому что его там уже и нету вовсе?.... Тогда наверно по той же причине ты и не можешь идентифицировать её по тексту в onclick?... Если так, то видимо кто-то ещё до тебя перебрасывает код onclick в eventlistener, а текст onclick затирает... Если так, значит тебе нужно успеть раньше него (я не знаю в какой момент подключаются расширения хрома) |
Сообщ.
#8
,
|
|
|
вот ты где!
|
Сообщ.
#9
,
|
|
|
Цитата Cfon @ а чё?! человек вон скучает, ни кто ему не помогает... вот ты где! |
Сообщ.
#10
,
|
|
|
Цитата K313 @ eventlistener При отладке ничего не вижу. Цитата K313 @ не обрабатывается послка click на ту кнопочку Обрабатывается. Но ищу по тексту на кнопке. И меня от такого хардкода передергивает. Чтение обработчика "onclick" (сообщение #3732537) А тут вопрос уже вообще по другому месту. Я вообще не могу понять, как оно работает. Формы там нет. Никаких обработчиков не вижу. Поиск стартует по нажатию на Enter, когда курсор в этом инпуте. Но как??? И как это симулировать? |
Сообщ.
#11
,
|
|
|
Цитата barazuk @ а, это у тебя разные кнопочки,.. вернее инпут... Ну а какой тогда смысл слать ему click? если это тип text и он на Enter настроен, ты ему keyDown или keyUp слать наверное должен?! и там если умники isTrusted проверяют, то ты наверно всё равно не сможешь ни чего отправить... В общем тебе к Google думаю А тут вопрос уже вообще по другому месту. А по первому вопросу - или попробуй пораньше влезть или ещё может получиться метод GroupsEdit.addBlacklist() перегрузить своим? раз ты знаешь его имя... |
Сообщ.
#12
,
|
|
|
Цитата K313 @ GroupsEdit.addBlacklist() перегрузить своим? Зачем??? Цитата K313 @ Ну а какой тогда смысл слать ему click? если это тип text и он на Enter настроен, ты ему keyDown или keyUp слать наверное должен?! Не проходит. Единственное, шо нарыл через Гугель - симуляция через JQuery. Но оно походу работает снова таки только для "своих" страниц и обработчиков. <input type="text" class="ui_search_field _field" id="sb_search_b057d4b7" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Поиск по подписчикам"> var v = document.getElementsByClassName('ui_search_field _field'); for (var i = 0; i < v.length; i++){ console.log(i + ". " + v[i].id); if(v[i].placeholder=="Поиск по подписчикам"){ v[i].value = "http://vk.com/id112208"; v[i].focus(); v[i].click(); var e1 = $.Event("keydown", { keyCode: 13 }); var srch = $(v[i]); if(srch.length) srch.trigger(e1); v[i].submit(); // ну а тут тупо матерится что низзя :) break; } } |
Сообщ.
#13
,
|
|
|
Цитата barazuk @ что бы перехватить...Зачем??? Цитата barazuk @ я в квери тоже не шарю, мне пока голого яваскрипт хватало v[i].submit(); // ну а тут тупо матерится что низзя Цитата barazuk @ Слал клик - не реагирует, формы вокруг вообще нет - так что сабмит некому делать, |
Сообщ.
#14
,
|
|
|
Цитата K313 @ что бы перехватить... И дальше что? Мои скрипты не видят оригинальные скрипты страницы и не могут их вызвать. В противном случае мне бы вообще не нужно было к кнопкам цепляться - просто обработчик бы вызвал. |