Как получить доступ к переменной вне события клика или контекста - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь получить доступ к переменной NewUrl в функции LaunchPopup при нажатии chat online.

Мой отладчик Chrome может видеть переменную в закрытии после события click.Я также пытался привязать переменную к этому, но переменная остается undefined.

[].forEach.call(document.querySelectorAll(‘.link '), function (doc) {

     doc.addEventListener('click', function() {
      var uniqueID = 'unique data';
      var NewUrl = Url.split("&response_type")[0] + encodeURIComponent("&uniqueID=" + uniqueID);
     });
     
     if (doc != null) {
      window.LaunchPopup = function() {
       var self = this;
       n = window.open(self.NewUrl, '_blank', 'width=450,height=600,scrollbars=yes,resizable=yes');
       return openPopup = n == null ? true : false;
      };
      
      doc.innerHTML = '<a href="' + Url + '" class="btn btn-default" target="_blank" onclick="return LaunchPopup();">Chat online</a>';
     }
    });

Справка, и некоторые объяснения приветствуются, почему переменная не может быть доступна.

Ответы [ 3 ]

0 голосов
/ 11 июня 2019

Вы можете просто объявить переменную newurl непосредственно в обратном вызове foreach, чтобы оба слушателя событий могли получить к ней доступ.

[].forEach.call(document.querySelectorAll(‘.link '), function (doc) {

     var NewUrl;

     doc.addEventListener('click', function() {
      var uniqueID = 'unique data';
      NewUrl = Url.split("&response_type")[0] + encodeURIComponent("&uniqueID=" + uniqueID);
     });
     
     if (doc != null) {
      window.LaunchPopup = function() {
       var self = this;
       n = window.open(NewUrl, '_blank', 'width=450,height=600,scrollbars=yes,resizable=yes');
       return openPopup = n == null ? true : false;
      };
      
      doc.innerHTML = '<a href="' + Url + '" class="btn btn-default" target="_blank" onclick="return LaunchPopup();">Chat online</a>';
     }
    });
0 голосов
/ 11 июня 2019

Нужно было внести изменения в реализацию, и это сработало нормально.

[].forEach.call(document.querySelectorAll(‘.link '), function (doc) {

     doc.addEventListener('click', function() {
      var uniqueID = 'unique data';
      var NewUrl = Url.split("&response_type")[0] + encodeURIComponent("&uniqueID=" + uniqueID);
      var n = window.open(NewUrl, '_blank', 'width=450,height=600,scrollbars=yes,resizable=yes');
      if(n == null) {
          return true;
      }
      e.preventDefault();
      return false;
     });
     
     if (doc != null) {
           
      doc.innerHTML = '<a href="' + Url + '" class="btn btn-default" target="_blank" ">Chat online</a>';
     }
    });
0 голосов
/ 10 июня 2019

Один из способов решить эту проблему - это немного реорганизовать его, разделив оператор if на его собственную функцию.Затем передайте doc и NewUrl в функцию.

Вам нужно будет выйти из window.LaunchPopup, чтобы получить более широкую область видимости и получить вызовы, передаваемые в this.

Наконец, я поместил newURL в атрибут data-, чтобы мы могли получить к нему доступ через this при нажатии на метку привязки

Вот пример.

[].forEach.call(document.querySelectorAll('.link '), function(doc) {

  doc.addEventListener('click', function() {
    var uniqueID = 'unique data';
    var newUrl = Url.split("&response_type")[0] + encodeURIComponent("&uniqueID=" + uniqueID);
    showPop(doc, NewUrl);
  });
});

function showPop(doc, theURL) {
  if (doc != null) {
    doc.innerHTML = '<a href="' + theURLUrl + '" data-new-url="' + newURL + '" class="btn btn-default" target="_blank" onclick="return LaunchPopup(this);">Chat online</a>';
  }
}

window.LaunchPopup = function(anchor) {
  var newUrl = anchor.getAttribute("data-new-url");
  var self = this;
  var n = window.open(newUrl, '_blank', 'width=450,height=600,scrollbars=yes,resizable=yes');
  return openPopup = n == null ? true : false;
};
...