Не работает POST запрос после form.submit

260
25 марта 2017, 01:06

При написании расширения для 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, но как заставить форму работать не один раз, а несколько, позволяя без перезагрузок через контекстное меню вызывать несколько раз эту функцию?

READ ALSO
JavaScript не сортирует колонки с датой в таблице HTML

JavaScript не сортирует колонки с датой в таблице HTML

В таблице есть столбцы с датами, и когда я сортирую их по дате, я вижу, что они отсортированы неправильно

282
Как перехватить AJAX запрос?

Как перехватить AJAX запрос?

Работаю с API SpotifyНужно сделать чтобы во время загрузки по api загружался loader и на странице нельзя было совершать каких-нибудь действий

352
Проблема с версткой видеоплеера HTML5

Проблема с версткой видеоплеера HTML5

Здравствуйте! Верстаю себе видео плеер на сайт:

264
Не правильная замена переменной в setInterval

Не правильная замена переменной в setInterval

Пишу псевдо-еквалайзер на канвасеСсылка на codepen

270