传递引用jQuery后无法访问元素属性

时间:2016-04-25 13:45:06

标签: javascript jquery

我有一个HTML网格,其行数可变,在第一列和第一列中都有一个日期选择器。第3列中的HTML按钮。

我需要获得按钮和放大器的参考。在函数中传递它(可能多一次)来调用它的点击或在不同的地方访问它的属性。

doSomething.call(this, { 'btnRef': myButton[0] }, condition);

进一步我将一个对象中的这个变量传递给另一个JS函数doSomething

unsavedObj['btnRef'] = arguments[0]['btnRef']; // I also tried jQuery(arguments[0]['btnRef'])

在doSmething函数中,我将此引用保存在全局JS对象

unsavedObj['btnRef'].attr('rel')
unsavedObj['btnRef'] // shows as undefined in console.

尝试通过全局对象访问属性后出现问题

jQuery(arguments[0]['btnRef'].attr('rel'))

我可以在var myButton获取值的函数内正确访问属性等//this is the datepicker handler which fires on select of a date. onSelect: function(d,i) { var condition = false; var myButton = $(this).closest('tr').find('input[type=button]'); var btnRel = myButton.attr('rel'); //some other vars myButton.prop("disabled", false); //this works fine if(jQuery(myButton).hasClass('xyz')){ if(changedFor !=''){ if(changedFor == btnRel){ condition = (changedFor == btnRel); } } doSomething.call(this,{'btnRef':myButton},condition);//passing to the function doSomething } } //doSomething function. function doSomething(){ var thisObj = jQuery(this) if(arguments[1]){ unsavedObj['btnRef'].triggerHandler('click',{'check':arguments[1]}); }else{ BootstrapDialog.show({ //this is a bootstrap dialogbox title:'', message:function(dialog){ var $content = "Are you sure?"; return '<div>' + $content + '</div>'; }, closable: false, buttons: [{ label:'Change', cssClass: 'btn', action: function(dialogItself){ unsavedObj['btnRef'] = arguments[0]['btnRef']; unsavedObj['context'] = thisObj; changedFor = unsavedObj['btnRef'].attr('rel'); //does not work unsavedObj['btnRef'].click(); //does not work dialogItself.close(); } },{ label:'Cancel', cssClass:'btn', action: function(dialogItself){ dialogItself.close(); } }] }); } } 也返回正确的结果。   这是由于背景导致的问题吗?。

示例代码:

A = LOAD 'bank.txt';
B = GROUP A by $0;
C = FOREACH B GENERATE group as Bank,COUNT(B.Branches_Field) cnt;
D = ORDER C BY cnt DESC;
E = LIMIT D 1;
DUMP E;

我很抱歉格式不佳。

感谢。

2 个答案:

答案 0 :(得分:2)

更改

 var myButton = $(this).parents('tr').find('input[type=button]');

 var myButton = $(this).closest('tr').find('input[type=button]');

然后改变

 doSomething.call(this, { 'btnRef': myButton[0] }, condition);

 doSomething.call(this, { 'btnRef': myButton }, condition);

现在您正在创建一个jQuery对象数组而不是一个html对象数组,因此.attr(...)函数应该可以正常工作。

编辑: 我怀疑这里有多个问题在起作用。既然你说上面没有用,那就让我们来看看doSomething.call(...)。在这里查看文档https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call。注意,这里没有jQueryable $(this),而是对你在调用语句中传递的参数的引用。

问题1:在其他任何地方都会调用doSomething吗?如果没有,那么让我们更明确地构建签名,并使用更传统的函数调用来调用它:

function doSomething(varA, varB, ...){   }

doSomething(....actual passed variables...)

让我们从那里开始,看看我们是如何做的。

答案 1 :(得分:0)

对不起,由于访问外部功能的arguments对象的闭包限制而发生此问题。这里Bootstrap.show({..'s按钮定义实际上是一个闭包。 通过创建arguments

的副本解决了这个问题

谢谢大家。