【问题标题】:Solution for javascript variable name conflict other than iframe?iframe以外的javascript变量名冲突的解决方案?
【发布时间】:2012-01-25 19:17:18
【问题描述】:

我使用 Classy 库在 javascript 中进行 OOP 编程。

我编写了一个类来处理 DIV 元素上的画布操作。由于代码的某些部分存在一些困难,我不得不在类中使用对象变量名,即使它违反了 OOP 方法。

例如:

drawer=new CanvasManager("div1",300,300);

var CanvasManager= Class.$extend({
    blabla:function()
{
    drawer.id=1;
}
});

现在我需要在不同 DIV 的一个文档中多次使用这个类,而这种冲突使它不可能。我唯一的解决方案是使用 iframe 元素将它们分开。

在我想从 codeigniter 视图而不是 controller 获取 iframe 内容之前没问题。

想用这样的东西

<iframe  class="iframeclass1">
<?php
echo $this->load->view('gallery/w2',array('item'=>$amount),true);
?>
</iframe>

而不是

<iframe  class="iframeclass1" src="<?php echo base_url(); ?>index.php/gallery/w2c/<?php echo $item->amount; ?>">
</iframe>

那么我们还有什么其他的办法来解决这个对象名冲突呢?

编辑

如果您首先问为什么要这样编码,一些 jquery 函数不允许您传递参数(例如 each() )。实际上只有 bind() 函数允许参数传递,这很有帮助。如果您知道任何解决方案,我会很高兴。

edit2

困难是这样的 可以说blabla函数就像

blabla:function()
{
$('.somediv').each(function()
{
  $(this).html(drawer.id);
}
)
}

在每个函数中,“this”关键字成为 jquery 选择器的指针。

【问题讨论】:

  • 您能否对为什么变量名是CanvasManager给出更全面/更清晰的解释?
  • 冲突的不是类名,而是对象名

标签: javascript jquery html oop codeigniter


【解决方案1】:
var appInstances = new array();
var keys = new array();
var id;

keys [0]['id'] = 'div1';
keys [0]['w'] = '300';
keys [0]['h'] = '300';
keys [1]['id'] = 'div2';

keys [1]['w'] = '300';
keys [1]['h'] = '300';

id  = 0;
appInstances[id] =CanvasManager(keys[id]['id'] , keys[id]['w'] , keys[id]['h']);
id  = 1;
appInstances[id] =CanvasManager(keys[id]['id'] , keys[id]['w'] , keys[id]['h']);

var CanvasManager= Class.$extend({
    blabla:function()
{
    appInstances[id].id=1;
}
});

【讨论】:

  • 问题是当您在类方法中使用 Jquery 每个函数时,您会失去对对象本身的访问权限,并且您无法知道它的 id 是什么。假设 blabla 函数就像 blabla:function() { $('.somediv').each(function() {drawer.id=1; });
  • 在 each() 函数中,这个关键字成为选定的 html 元素,因此您无法访问对象本身的 id
【解决方案2】:

解决方案是使用 javascript 闭包。 例如: http://jsfiddle.net/C7yen/

<ul>
    <li>a</li>
    <li>b</li>
    <li>c</li>
</ul>
<script>
    obj={
       id:1,
        set:function()
        {
            setF=(function(ev){ return function(){ $(this).html(ev.id) } })(this);
            $('li').each(
    setF
    );
        }
    }
window.onload=function()
    {
obj.set()
    }
</script>

【讨论】:

    【解决方案3】:

    创建一个单例类来管理给定 div 上的类的定义。另外,当你可以创建一个对象时,为什么要给整个班级?这不是 OOP 的主要思想吗?

    【讨论】:

    • 我没有在任何地方给出类本身:/它是给出的对象,抽屉是对象,canvasmanager 是类。
    • 我在您尚未编辑帖子时发布了此内容。在这种情况下,您可以创建一个工厂方法。只需将 div 设置为您想要的对象。
    • 我认为你弄错了,我没有在选定的 div 上链接或创建新对象 - $('.somediv') -。我只是对那些div的innerhtml做一些操作。
    • 我明白了,但是你可以设置一个初始化器,它通过你的所有 div 并在迭代器中构造指定 div 的对象,而不是当你需要 div 5 时你只需执行 obj['div5'] .draw 而在此之前你做 obj['div5'] = new CanvasManager("div5",300,300);所以你知道什么对象是什么,并且有多个 CanvasManager 对象设置在具有不同变量名称的不同 div 上。
    • 当 blabla 方法在 each() 调用中失去对对象本身的访问权时,它如何知道它在 obj['div5'] 内部被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多