通过包含无效字符串的变量设置对象

时间:2016-11-18 05:14:05

标签: javascript jquery html

我在我的网站上开发了一个非常基本的音频播放器,类似于SoundClouds。

我已成功完成它,我开始清理所有标记,包括(尝试)删除所有内联事件处理程序(即:onclick=""onkeyup="")< /强>

但是,我在执行此操作时遇到了一些问题。

这有点难以解释所以我将发布我的JavaScript,然后让你知道问题是什么:

$(".track-w__trigger").click(function(){
    var tid = $(this).attr('aria-trackid'); // aria-trackid is equal to a random integer created by PHP
    var tiW = 'w' + tid + 'w'; // this is an object (i.e: w3w)
    playPauseButton(this, tiW, ti);
});

function playPauseButton(button, wave, trackID){
    var button = $(button);

    if(wave.isPlaying()){ // the object (w3w.isPlaying())
        button.removeClass("playing");
        wave.pause();
    } else {
        button.addClass("playing"); 
        wave.play();
    }
}

我曾经拥有的是

<div class="track-w__trigger" onclick="playPauseButton(this, w3w, 3)" id="w3w-trigger"></div>

现在是:

<div class="track-w__trigger" aria-trackid="3" id="w3w-trigger"></div>

正如您在第二段代码中看到的那样。 w3w是一个对象。但是,因为我使用click函数在单独的script中使用字符串引号来设置它。 JavaScript 已经成为string

所以现在我以wave.isPlaying()为例;它什么都不做。

我不知道如何解决这个问题,谷歌的任何结果都无法帮助我。任何帮助解决这个问题将不胜感激,

谢谢!

编辑

这就是&amp;如何设置w3w

var w3w = Uki.start({
    // e.t.c
});

3 个答案:

答案 0 :(得分:1)

使用eval wave = eval(wave);  将字符串计算为函数

或使用更安全的方式

wave = window[wave];

https://jsfiddle.net/zmr412q7/

答案 1 :(得分:0)

不要将每个对象作为单独的变量,而是创建一个对象,该对象包含代表wNw中N的id的每个对象。例如:

var wNw = {};

// represents w1w
wNw[1] = (Uki.start({
    // e.t.c
}));

// represents w17w
wNw[17] = (Uki.start({
    // e.t.c
}));

// represents w3w
wNw[3] = (Uki.start({
    // e.t.c
}));

这为您提供了一个看起来像这样的对象:

{
   1: object_that_was_w1w
   17: object_that_was_w17w
   3: object_that_was_w13w
}

然后你的点击处理程序如下所示:

$(".track-w__trigger").click(function(){
    var tid = $(this).attr('aria-trackid'); // aria-trackid is equal to an integer of 1 to 5
    var tidNum = parseInt(tid);
    playPauseButton(this, wNw[tidNum], ti);
});

答案 2 :(得分:0)

您可以尝试这样的事情,

var tid='w'+5+'w';
var tryout=tid.valueOf();
console.log("getting the object "+tryout)

valueOf属性将字符串转换为对象