Работа с очень странной проблемой gChrome / Javascript - PullRequest
4 голосов
/ 09 марта 2011

Я работаю над расширением Chrome, где мне нужно нажать на <input type='file' /> в javascript через jQuery, чтобы открыть диалоговое окно «Сохранить как».Да, мне сказали - большинство браузеров не позволяют вам делать это.Однако я обнаружил кое-что очень странное - я могу щелкнуть элемент ввода файла (и открыть всплывающее окно «Сохранить»), если я сделаю это через адресную строку, например:

javascript: $("<input type='file' />").appendTo("body").click();

Итак, я подумал, что если бы я мог сделать это там, то, конечно, я мог бы сделать это из своего скрипта контента ...

Очевидно, я был неправ.Запуск $("<input type='file' />").appendTo("body").click(); из моего скрипта содержимого не только добавляет zilch к добавлению элемента, но даже эмулирует адресную строку и делает window.location = "javascript: $(\"<input type='file' />\").appendTo(\"body\").focus().click();"; zilch .

Сначала я думал, чтоможет быть, это было какое-то ограничение chrome в контентных скриптах, но я ошибаюсь - расширение jsShell , которое работает через контентный скрипт, может запускать команды и получать желаемые результаты без помех.

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

Это заставляет мою голову перегреваться, поэтому любая помощь очень ценится!

1 Ответ

1 голос
/ 09 марта 2011

Не уверен, в чем корень проблемы, но мне удалось немного сузить ее, может быть, это было бы полезно для вас.

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

$("body").mouseover(test);

function test() {
    $("<input type='file' />").appendTo("body").click();
}

Это тоже работает:

$("body").append($("<a/>").text("test").click(test));

Но это не так:

$("body").append($("<a/>").text("test").click(function(){
    setTimeout(test,1000);
}));

Jsshell оценивает ваш скрипт по нажатию кнопки, чтобы он работал, если вы попытаетесь оценить этот скрипт без нажатия кнопки, он не будет работать.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...