При написании расширения для Firefox, который бы просто отправлял POST запрос при выборе пункта в контекстном меню, столкнулся с такой проблемой:
POST запрос отправляется, но только один раз. Остальные нажатия игнорируются.
Код следующий:
chrome.contextMenus.create({
"id":"Send",
"title": 'Отправить',
"contexts": ["link"],
"onclick": function (info, tab) {
var str = info["linkUrl"];
if (str.indexOf("wall")!==-1) //в ссылке найден wall, значит допустима
post('https://vk.com/al_mail.php', {
"Message":"",
"act":"a_send",
"ajax":"1",
"al":"1",
"chas":"d3074e0fd03101d4d6",
"from":"box",
"media": str.substr(str.indexOf("wall")),
"title":"",
"to_ids":"айди пользователя"
})
}
});
Как видно из кода, не скрываю саму задачу - отправить пост VK в личку пользователя при выборе пункта конт. меню.
Функция post выглядит так:
function post(path, params, method) {
method = method || "post";
var form = document.createElement("form");
form.setAttribute("method", method);
form.setAttribute("action", path);
for(var key in params) {
if(params.hasOwnProperty(key)) {
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", key);
hiddenField.setAttribute("value", params[key]);
form.appendChild(hiddenField);
}
}
document.getElementsByTagName('body')[0].appendChild(form);
form.submit();
}
Предполагаю, что проблема игнорирования второй итерации в том, что form.submit может сработать лишь 1 раз на странице без её обновления.
Пробовал альтернативный немного костыльный вариант:
var creating = browser.tabs.create({url:"about:blank"});
creating.then(ScrExec);
function ScrExec(tab) {
browser.tabs.executeScript(tab.id, {file: "/scripts/submitForm.js"});
browser.tabs.sendMessage(tab.id,
{"Message":"",
"act":"a_send",
"ajax":"1",
"al":"1",
"chas":"d3074e0fd03101d4d6",
"from":"box",
"media": str.substr(str.indexOf("wall")),
"title":"",
"to_ids":"айди пользователя"}
)
}
Идея состояла в том, чтобы открыть новую вкладку, передать в неё скрипт submitForm.js, в котором указана та же функция post и приёмщик onMessage, запускающий её. А потом закрыть эту вкладку после отправки POST запроса. Но идея провалилась на этапе передачи файла скрипта. Видимо, безопасность Мозиллы теперь исключает такие способы.
Так же пробовал использовать $.ajax, но столкнулся с тем, что он не поддерживает HTTPS.
Ещё пробовал XMLHttpRequest - здесь оказалась проблема, что посылает запрос он отдельно и браузер считает его кросс-доменным запросом и просит разрешений от сервера Access-Control-Allow-Origin.
В общем, единственная реально работающая идея - это form.submit, но как заставить форму работать не один раз, а несколько, позволяя без перезагрузок через контекстное меню вызывать несколько раз эту функцию?
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости