jQuery函数找不到容器 - 也许是克隆错误?

时间:2012-05-21 22:01:06

标签: javascript jquery

我有一个案例,我以前没有,真的无法弄明白,问题是什么。 :( 我试图为我的旧的,未解决的js代码创建一个控制器类,试图让它更加面向对象(是的,对我而言失败,但是练习也是知识的母亲)。 所以,这是我的代码:

一个函数调用Main函数,它处理变量并弹出一个表单,如:

function Main(com,  multiple, grid) {
    if (CheckTableFunctions(arguments) == true)
    {
        var partner = Partner.Factory(com);
        switch(com)
        {
            case "CreatePartners":
            ...
            break;

            case "GetPartners":
            $e = ShowModal(); // <- this makes a form visible
            Communicate(com, partner, function(data) <- ajax req. with callback
                {
                ... // <- manipulate data, fill form, etc.
                });
            Main("EditPartners", multiple, grid); // <- calling Main Editpartners case
            break;

实际上,GetPartners案例在EditPartners之前,但它只是用于填写表单。编辑和事件绑定转到editpartners,如下所示:

            case "EditPartners":
            $e = GetModal(); // <- THE ERROR
            $e.find("a.submit").click(function(e){
                partner.fx_data.partner.data = getFormData($e)
                Communicate(com, partner, function(data) // <- return the modified values by ajax
                {
                    CloseModal();
                });
            });
        break;

因此,当我运行fn GetModal时,它返回一个空对象,但在GetModal = fn(){$e=$(".poppedModal");return $e;}运行后该函数正常Main(EditP)。我认为这比其他任何事情更合乎逻辑或更有条理。说实话,我用回调来调用它,这意味着我使用了ShowModal(callback),当它准备就绪时,我调用了Main(EditP),但也没有用。{/ p>

修改

抱歉,我忘记了主要问题(我认为是主要问题)。所以我没有完全形式我只有一个html原型。原型,因为我总是在需要的时候克隆它。

所以这是showmodal fn,我认为这使得模态无法访问: <击>

<击>
function ShowModal()
{
    $container = $('#myModal');
    $clone = $container.clone();
    $clone.removeAttr("id").addClass("clonedModal");
    $clone.modal('show');
    return $clone;
}

<击>

function ShowModal()
{
    $container = $('#partnerModal');
    document.getElementById('partnerForm').reset();
    $container.modal('show');
    return $container;
}

感谢您的帮助。

REPAS

1 个答案:

答案 0 :(得分:1)

有几点:

  1. javascript函数中的成员仅在使用var声明时才会进行本地化。否则,它们是“外部”成员,包括全局名称空间。你的几个变量需要本地化。未申报的变量可能会导致令人讨厌的错误。
  2. .clone()确实会创建一个DOM片段的克隆,但不会自动将其惰性化回DOM。您需要使用jQuery指令执行此操作,例如.append().prepend().before().after()。我强烈怀疑你的问题的很大一部分是试图在未插入的克隆上进行.modal()
  3. 目前尚不清楚为什么每次使用时都需要克隆表单。这种编程可能会导致内存泄漏。重用单个表单会更清晰,更正常。重置表单以清除以前输入/选择的值并不困难。
  4. 编辑:

    ShowModal具有正确的本地化变量:

    function ShowModal() {
        var $container = $('#partnerModal');
        document.getElementById('partnerForm').reset();
        $container.modal('show');
        return $container;
    }
    

    事实上,如果.modal()被编写为可链接的,那么ShowModal()可以简化,以避免创建任何命名成员,本地或其他:

    function ShowModal() {
        $('#partnerForm').get(0).reset();
        return $('#partnerModal').modal('show');
    }
    

    另外,请注意,按照惯例,在javascript编程中,只应使用初始Capital命名构造函数。构造函数是那些旨在使用new Fn()调用的函数。 (这里并不重要,但是对构造函数的主题进行了大量讨论,有些人选择编写代码以避免使用new)。