变量更改后调用事件

Posted

技术标签:

【中文标题】变量更改后调用事件【英文标题】:Call event after variable has changed 【发布时间】:2019-04-11 22:41:04 【问题描述】:

对于一个学校项目,我正在制作一个让用户互相倾听的网站。

到目前为止,我有这个按钮可以让用户收听另一个用户正在收听的歌曲,包括正确的位置。但这只会调用这个函数一次。

我想要的是当 [randomNummer 更改时,它会自动再次调用该函数。有谁知道我该如何做到这一点以及我必须使用什么来实现这一点?

这是按钮的代码:

         document.getElementById('play-song').addEventListener('click', function()       
        $.ajax(
          url: 'https://api.spotify.com/v1/me/player/play',
          type: 'PUT',
          headers: 
            'Authorization': 'Bearer ' + access_token
          ,
          dataType: "json",
          contentType: "application/json",
          data: JSON.stringify(
            "uris": [randomNummer],
            "position_ms": seconds
          )
        );
        , false);  

randomNummer 当前是使用 Array 生成的:

var randomNummer;      
    var myArray = [
      "spotify:track:1EtcyegB7JLkAwwqiPyeJ6", 
      "spotify:track:6rAXHPd18PZ6W8m9EectzH", 
      "spotify:track:5qaEfEh1AtSdrdrByCP7qR", 
      "spotify:track:1CnPYaKxTVb4LWOtiGOm0m", 
      "spotify:track:3qEg6xYffvuvwpq4U6FRrK"
    ];

    setInterval(function()
           callItem();
        , 200000); 
   var callItem = function()       
    randomNummer = myArray[Math.floor(Math.random()*myArray.length)];
      document.getElementById("song-uri").innerhtml = randomNummer;
   

【问题讨论】:

【参考方案1】:

我看到你使用了 Jquery。所以... 首先稍微修改一下你的代码:

$('#play-song').on('click', function(e) 
  $.ajax(
    url: 'https://api.spotify.com/v1/me/player/play',
    type: 'PUT',
    headers: 
      'Authorization': 'Bearer ' + access_token
    ,
    dataType: "json",
    contentType: "application/json",
    data: JSON.stringify(
      "uris": $("#song-uri").val(),
      "position_ms": seconds
    )
  );
, false);

还有:

var randomNummer;
var myArray = [
  "spotify:track:1EtcyegB7JLkAwwqiPyeJ6",
  "spotify:track:6rAXHPd18PZ6W8m9EectzH", 
  "spotify:track:5qaEfEh1AtSdrdrByCP7qR", 
  "spotify:track:1CnPYaKxTVb4LWOtiGOm0m", 
  "spotify:track:3qEg6xYffvuvwpq4U6FRrK"
];
setInterval(function()
  callItem();
, 200000);
var callItem = function()
  randomNummer = myArray[Math.floor(Math.random()*myArray.length)];
  $("#song-uri").val(randomNummer);

在这种情况下,我们将使用隐藏输入来存储随机数:

<input type="hidden" id="song-uri" />

最后捕获更改事件:

$("#song-uri").on('change', function(e)
  //event on change random value
);

【讨论】:

当我实现这个时,我在控制台中得到 ''Undefined'' as randomNummer 现在似乎对大多数人都有效。只有那个捕获更改事件似乎没有做任何事情。我已经这样测试过它:` $("#song-uri").on('change', function(e) buttonPressed = +1; );` 但是 buttonPressed 的值根本没有变化。 【参考方案2】:

var randomNummer = 
    value: function value(newValue) 
        // if a new value is set, assign it to the internal "_value" and trigger the callback which can do stuff as you want
        if (typeof newValue !== "undefined") 
            this._value = newValue;
            this.callback();
        
        // always return the current value
        return this._value;
    ,
    callback: function callback() 
        // do the stuff you want to do after value alters
        console.log("Value altered to " + this._value);
        
;

var myArray = [
      "spotify:track:1EtcyegB7JLkAwwqiPyeJ6", 
      "spotify:track:6rAXHPd18PZ6W8m9EectzH", 
      "spotify:track:5qaEfEh1AtSdrdrByCP7qR", 
      "spotify:track:1CnPYaKxTVb4LWOtiGOm0m", 
      "spotify:track:3qEg6xYffvuvwpq4U6FRrK"
];

var callItem = function() 
    document.getElementById("song-uri").innerHTML = randomNummer.value(myArray[Math.floor(Math.random()*myArray.length)]);

setInterval(callItem, 2000); 
&lt;div id="song-uri"&gt;&lt;/div&gt;

变量有点愚蠢。但是,如果您不直接分配新值,而是使用函数,您可以给他们一点控制权。

【讨论】:

以上是关于变量更改后调用事件的主要内容,如果未能解决你的问题,请参考以下文章

ios 7中的重大位置更改事件-后台服务调用

线程间的通信同步方式与进程间通信方式

Flutter:未处理的异常:错误状态:调用关闭后无法添加新事件(不一样的情况)

在页面加载中默认调用更改事件 - 淘汰赛

静态变量和成员变量有什么区别?应该怎么调用?

如何在下拉更改事件中调用 AJAX 请求?