【问题标题】:Javascript parameters being overriddenJavascript 参数被覆盖
【发布时间】:2015-06-05 02:35:06
【问题描述】:

我有类似这样的代码:

for (i = 0; i < imageData.length; i++) {

    for (j = 0; j < sizes.length; j++){
        width = sizes[j][0];
        height = sizes[j][1];

        objectId = 'cropper-' + i + '-' + j;
        var $image = $('#' + cropperId + ' > img'),
            $preview = $('#preview_cropper-' + i + '-' + j),
            $btn = $('strict-mode_cropper-' + i + '-' + j);

        var options = {
            ...
            width: width,
            height: height,
            $preview: $preview, 
            ...
        };
        $btn.on("click", {$image: $image, options: options}, foo);
    }
}


function foo(e) {
    var $image = e.data.$image; // Gives the correct Image
    var $preview = e.data.options.$preview // Always the last $preview. Not the one that was passed in!
    var width = e.data.options.width //Also incorrect
    var height = e.data.options.height //Also incorrect
}

问题在于,当用户单击$btn 之一时,“选项”中的所有字段始终是嵌套循环的最后一个(即当 i = imageData.length - 1 和 j = size.长度 - 1)。 #

奇怪的是,传入的$image 是正确的!

为什么会这样?我该如何解决这个问题?

【问题讨论】:

  • 您没有发布设置$preview 变量的代码。

标签: javascript jquery parameter-passing jquery-events


【解决方案1】:

在 for 循环中,'options' 包含映射

preview: $preview, 

意味着存储在“选项”中的名称只是“预览”。所以你需要以

的身份访问预览
e.data.options.preview

而不是

e.data.options.$preview

【讨论】:

  • 对不起,这只是一个错字!但不是问题。但很好的收获
  • 如何有一个不影响您的代码的错字?你是亲手抄的吗?
  • 是的,基本上我的实际代码有点复杂,所以我删除了代码中不相关的部分(因此在编写问题时出错了)。无论如何,很明显这不是问题,因为问题也发生在宽度和高度上。
【解决方案2】:

这是我设法做到的快速修复:

而不是:

$btn.on("click", {$image: $image, options: options}, foo);

我这样做了:

$btn.on("click", {$image: $image, options: $.extend({},options)}, foo);

我相信这会复制“选项”而不是传递实际变量。

欢迎提供更好更详细的答案!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    相关资源
    最近更新 更多