首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jQuery修改加载时动态添加的元素

使用jQuery修改加载时动态添加的元素
EN

Stack Overflow用户
提问于 2013-10-02 13:42:07
回答 3查看 1.6K关注 0票数 1

我正在转换我们与门户(Liferay)一起使用的旧的jQuery版本1.2.6代码。以前,我们使用livequery插件将事件添加到动态添加的DOM对象中。现在这是内置到jQuery ( on()函数)的特性。我已经弄清楚了。

然而,livequery中也有一个特性,它允许我们在加载时修改这些动态加载的对象(即不绑定到某些事件):

代码语言:javascript
复制
$(".myTextBox").livequery(function() { $(this).val("initial value"); });

在我们的门户中加载ajax portlets时,我并不控制代码,因此在创建时我无法修改内容。

我试过几件事都没有用。下面是我认为可以工作的jQuery,但不起作用。我将jQuery添加到portlet中,以便将其加载到portlet的底部,并将jQuery添加到文件中。

代码语言:javascript
复制
<footer-portlet-javascript>myscript.js</footer-portlet-javascript>

..。

代码语言:javascript
复制
$(document).ready(function() {
    $(".myTextBox").val("initial value");
});

这不管用。如果我写了一个警告($(“.myTextBox”)),它会显示一个对象,但是警告($(“.myTextBox”).val())是未定义的。

有什么办法能让我工作吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-02 15:50:34

根据我所读到的,您希望将事件连接到尚未添加到DOM中的项,而这些项在您进行连接函数激发时还没有被添加。我还读到您正在升级到最新版本的jquery。

如果您正在使用jquery 1.7+,则.on()方法应该为您提供此功能。如果您使用的是1.2.6到1.7之间的东西,则需要使用.live()方法来实现这种行为。

代码语言:javascript
复制
$(".myTextBox").live('click', function(e){
    console.log(this.value);
});

或者,你可能想要混合到一些AUI中去做你在Liferay 'allPortletsReady‘发布事件上的连线。下面是一些代码,用于在所有portlets完成加载后将项目连接起来:

代码语言:javascript
复制
//This is the AUI version of on document ready
//  and is just used to form a 'sandbox'(clojure)
//  around our code so the AUI object A is not modified
AUI().ready(function(A){
    //This essentially subscribes the provided function
    //  to the Liferay custom event 'allPortletsReady'
    //  so that when it's fired, the provided function
    //  will be called.
    Liferay.on('allPortletsReady', function(){
        //Do your initialization here
        myCustomPortletManager.init();

        //OR
        A.one("#mySelector").on('click', function(e){
            //do your work here
        });
        //Etc.
        //NOTE: jQuery ($) is valid inside this sandbox for our
        //instance.
    });
}):
票数 1
EN

Stack Overflow用户

发布于 2013-10-02 13:50:55

首先,在本例中,您可能希望使用ID而不是类来确保具体引用单个元素。

您的警报将确定此代码是在执行之前还是之后执行。这将解释为什么您返回一个对象,但没有返回值。将其放在值赋值之后,无论是在页面上还是临时的。

下面的工作非常好(http://jsfiddle.net/4WHyE/1/):

代码语言:javascript
复制
<input id="myid"/>

$('#myid').val('some value')
alert($('#myid').val())    

如果必须使用类,则取决于要将每个类元素单独设置还是全部设置为相同的值。如果希望它们都具有相同的值,只需在上面的示例中用类替换id:

代码语言:javascript
复制
<input class="myclass"/>
$('.myclass').val('myvalue')

如果希望设置唯一值,可以简单地迭代它们(http://jsfiddle.net/4WHyE/2/):

代码语言:javascript
复制
$('.myclass').each(function(index){
    $(this).val('value' + index)
});
票数 0
EN

Stack Overflow用户

发布于 2013-10-02 14:02:10

您可以使用setInterval来迭代检查新元素。

代码语言:javascript
复制
setInterval(function(){

   var $ele = $('.myTextBox:not(.loaded)'); // find new element that not loaded
   if($ele.size() > 0){
      $ele.each(function(){
         // do stuff with elements
         $(this).val("initial value");
      }).addClass('loaded'); // flag this element is loaded
   }

}, 200); // set delay as you wish

顺便说一句,我不推荐这个。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19138341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档