【问题标题】:Prevent closure in jQuery/JavaScript防止在 jQuery/JavaScript 中关闭
【发布时间】:2012-06-26 20:01:34
【问题描述】:

我正在尝试做一些看起来(至少在我看来)相当容易、常见的事情。

这是我在网页上获得的 HTML:

<div class="allergiesDiv">
    <div>
        <span class="editButton">Allergies</span><br />
    </div>
        <span>Allergies</span>
    </div>
</div>

我用$('.editButton').button() 将第一个&lt;span&gt; 变成了一个jQuery 按钮。 (我在页面上有很多这样的对。)

我正在尝试做的是:

  1. 单击按钮时,它会加载一个 jQuery 对话框,其后的 span 值会加载到 &lt;textarea&gt; 中。 (奖励:加载对话框后,我希望 &lt;textarea&gt; 成为焦点并突出显示里面的所有文本。)
  2. 用户可以编辑该值,然后单击“确定”。
  3. 当用户单击“确定”时,对话框将关闭,输入的新值用于替换跨度的旧值。

这是我尝试使用的代码(这在 IE 中可以正常工作,但在 Mobile Safari 和 PC 版 Chrome 中会中断):

注意:我一直在将代码切分一些,以尝试隔离每个问题。我有这个工作,至少在 IE 中。

// How I get the button and bind to the click event
$('.editButton')
    .button({icons: {primary:'ui-icon-pencil'} })
    .click(EditClicked);

// 'Edit' button click handler
function EditClicked() {
    var span = $(this).parent().next().children().first();
    var text = span[0].innerText;
    var dialog = $('<div>').prop('title', 'Edit: ' + $(this).text());
    var textArea = $('<textarea>').css('width', '98%').prop('rows', '4').html(text);
    textArea.appendTo(dialog);

    var windowWidth = $(window).width();
    var buttonTop = $(this).button().offset().top;
    $(dialog).dialog({ 
        modal: true, 
        minWidth: windowWidth / 2, 
        position: ['center',buttonTop], 
        buttons: {
            'Ok' : function () {
                OKClicked(span);
            },
            'Cancel' : function () {
                $(this).dialog('close').remove();
            }
        }
    });
    textArea.focus().select();    
}

// Dialog 'OK' button click handler
function OKClicked(span) {
    var text = $(this).find('textarea')[0].innerText;
    span.html(text);
    $(this).dialog('close').remove(); 
}

当它到达var buttonTop... 时,它当前被破坏,并显示“按钮未定义”的错误消息。我还没有弄清楚为什么会这样(我曾经在那个方法中有一个名为 'button' 的变量,但现在它已经消失了。不确定这是否是一个缓存问题。)

除此之外,谁能看出我的流程出了什么问题?似乎我对闭包有某种误解,但我对 JavaScript 的了解还不够好,无法理解如何摆脱这段代码的扭结。

【问题讨论】:

  • 您是否包含其他库,例如 mootools?
  • 第二个内部 div 缺少 &lt;div&gt;,是吗?

标签: javascript jquery jquery-ui closures


【解决方案1】:

怎么样

var buttonTop = $(this).offset().top;

【讨论】:

  • 是的,我一开始就是这样,但那条线一直断线,所以我想我会尝试看看 button() 指定是否有帮助。它没有,我只是还没有删除那部分。
【解决方案2】:
  1. 我不确定,$('&lt;div&gt;') 是 jQuery 的正确语法。尝试改用$('div')
  2. 当你使用$(this).button() - 你尝试调用$(this) 对象的button 方法。看起来像一个错误。

【讨论】:

  • $('&lt;div&gt;') 创建一个 HtmlDivElement,然后将其附加到 DOM 中。
  • 所以,它创建了div 元素,没有结束标签。您确定所有浏览器都正确支持它吗?
  • 我没有说明 Html 是否有效,我只是说明正在发生的事情。 $('div') 将尝试定位 DOM 中的所有 div,这与创建新元素截然不同。
猜你喜欢
  • 1970-01-01
  • 2010-12-06
  • 2014-03-06
  • 1970-01-01
  • 2011-02-11
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多