【问题标题】:Converting Straight JS to JQuery将直接 JS 转换为 JQuery
【发布时间】:2011-06-14 14:16:07
【问题描述】:

我正在尝试从 last.fm API 附加一些 JSON 数据,

我已经在几个阶段使用 alert() 来验证 API 是否被正确解析,

这让我得出结论 getElementById().appendChild() 不起作用,下面是我设置的测试页面的 URL:

http://mutant-tractor.com/tabtest.html

所以我被建议从这个直接的 JS 转移到 JQuery 是最好的方法, 也就是说,我对任何 JQuery 都一无所知,而我的 JS 知识是基于我所做的一些基本 Java...

将其转换为工作 JQuery 有多简单/不简单? 我会为此悬赏,但我不知道该怎么做。

function calculateDateAgo(secAgo) {
 var agoString, agoRange, agoScaled;
 if(secAgo >= (agoRange = 60*60*24)) 
   agoString = (agoScaled = Math.floor(secAgo/agoRange))+" "+(agoScaled>1?"days":"day") + " ago";
 else if(secAgo >= (agoRange = 60*60))
   agoString = (agoScaled = Math.floor(secAgo/agoRange))+" "+(agoScaled>1?"hours":"hour") + " ago";
 else if(secAgo >= (agoRange = 60))
   agoString = (agoScaled = Math.floor(secAgo/agoRange))+" "+(agoScaled>1?"minutes":"minute") + " ago";
 else if(secAgo >= -60)
   agoString = "blastin' out now";
 else
   agoString = "soon ;)";
 return agoString;
}

function truncateName(name, l) {
return name.length > l ? name.substr(0,l-2) + "\u2026" : name;
}

function lfmRecentTracks(JSONdata) {

try { 
 var eImg, eLink, eSpan, divTag, eWrapper;
 var oTracks = new Array().concat(JSONdata.recenttracks.track);
 for (var i = 0; i < oTracks.length; i++) {
  //insert coverart image
  var spanTag  = document.createElement("span");
  document.body.appendChild(spanTag);
  spanTag.className = "lfmTrackImageCell tab_item";
  if(oTracks[i].image[1]["#text"] != "") {
   eImg = document.createElement("img");
   spanTag.appendChild(eImg);
   eImg.src = oTracks[i].image[1]["#text"];
   eImg.className = "lfmTrackImage";
  }else{
    eImg = document.createElement("img");
    spanTag.appendChild(eImg);
    eImg.src = "http://cdn.last.fm/flatness/icons/res/3/track.png";
    eImg.className = "lfmTrackImageNotFound";
  }
 }
for (var i = 0; i <>[lessthanhere] oTracks.length; i++) {
  //insert track link
  spanTag = document.createElement("span");
  spanTag.className = "lfmTrackInfoCell tabslider";
  eLink = document.createElement("a");
  eLink.appendChild(document.createTextNode( truncateName(oTracks[i].name, 25) ));
  //alert(truncateName(oTracks[i].name, 25));
  spanTag.appendChild(eLink);
  eLink.href = oTracks[i].url;
  //alert(oTracks[i].url);
  eLink.target = "new";
  eLink.className = "lfmTrackTitle";
  document.body.appendChild(spanTag);

  //insert artist name
  eSpan = document.createElement("span");
  eSpan.appendChild(document.createTextNode(truncateName(oTracks[i].artist["#text"], 22) ));
  //alert(truncateName(oTracks[i].artist["#text"], 22));
  eSpan.className = "lfmTrackArtist";
  document.body.appendChild(eSpan);

  //insert date
  eSpan = document.createElement("span");
  spanTag.appendChild(eSpan);
  eSpan.appendChild(document.createTextNode(   (typeof oTracks[i].date=="undefined"?"now playing":calculateDateAgo(new Date().getTime()/1000 - oTracks[i].date.uts))  )); 
  //alert((typeof oTracks[i].date=="undefined"?"now playing":calculateDateAgo(new Date().getTime()/1000 - oTracks[i].date.uts))); 
  eSpan.className = "lfmTrackDate"; 
  document.body.appendChild(eSpan);
 }  
} catch(e) {}
}

上述代码的唯一工作方式是使用 document.body.appendChild()

我尝试调用正文底部和内联的脚本以允许完全加载 DOM,但这些都不起作用。

我试图将它们附加到的 div 是 4 个不同的 div,即在 for 循环中,每个循环都需要引用不同的元素,

提前致谢! 迈尔斯

编辑:

HTML 代码:

    <link href='css/style.css' rel='stylesheet' type='text/css' />
    <script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js'></script>
    <link rel="stylesheet" type="text/css" media="all" href="http://beta.mutant-tractor/wp-content/themes/toolbox/style.css" />
    <link href='/css/tabbedContent.css' rel='stylesheet' type='text/css' />
    <script src="/scripts/JQuery/tabbedContent.js" type="text/javascript"></script>
    <script type="text/javascript" src="/scripts/General/lastfmtest.js"></script>
</head>
<body>
    <aside class="widget">
    <h3>I'm listening to...</h3>

    <div class="tabbed_content">
        <div id="lfmArtRow" class="tabs">
            <div class="moving_bg">
                &nbsp;
            </div>
            <script type="text/javascript" src="http://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&amp;user=mutant_tractor&amp;api_key=6b85edc3841f3d0935d9dfed9c556634&amp;limit=4&amp;format=json&amp;callback=lfmRecentTracks"></script>
        </div>
    </aside>
    <div id="lfmRecentTracks" style='padding: 15px;'>
        <div class="content">
            <div class="tabbed_content">
                <div class="slide_content">                     
                    <div class="tabslider">
                        <div class="sliding_info">Test 1
                        </div>
                        <div class="sliding_info">Test 2
                        </div>
                        <div class="sliding_info">Test 3
                        </div>
                    <div class="sliding_info">Test 4
                        </div>
                    </div>
                    <br style="clear: both" />
                </div>
            </div>
        </div>
    </div>
    <div id="test">
        </div>
</body>

【问题讨论】:

  • “我会悬赏……”你还没有yet earned that privilege。你至少需要 75 个。
  • 查看相关的 HTML 标记会很有帮助。没有理由说“纯 JavaScript”不应该工作,将所有内容转换为 jQuery 的建议听起来是善意的,但值得怀疑,尤其是考虑到您声称完全不熟悉该框架。
  • 虽然 JavaScript 可以让你侥幸逃脱,但始终以分号结束行。如果你想保持清醒,你必须比 JS 更严格。
  • 无法解释的反对票太拖累了。
  • 请注意,JavaScript 是与 Java 非常不同的野兽,尽管它的名称中包含 Java 并且语法表面上相似。名称的重叠只是 Netscape 和 Sun 的营销。

标签: javascript jquery json dom last.fm


【解决方案1】:

代替

document.body.appendChild( ... );

让您的函数找到您想要添加内容的&lt;div&gt;,如下所示:

var targetDiv = document.getElementById('lfmRecentTracks');

(请确保确保页面上只有一个元素具有该“id”值!另外,为了 IE,请确保该名称不是“名称”属性在任何事情上。)

那么你应该可以做到这一点:

targetDiv.appendChild( whatever );

【讨论】:

  • 嗨 Pointy,在 FireBug 中我不断收到 TargetDiv 为空?尽管定义很明确,但知道为什么会这样吗?
  • 确保您的代码运行目标&lt;div&gt;元素已被浏览器解析。这意味着将您的代码放在绑定到窗口“加载”事件的函数中,或者将脚本放在(或导入)页面正文的最后。
  • 另外,在 Firebug 控制台中,您应该可以直接输入“document.getElementById('lfmRecentTracks')”并获得结果
  • 谢谢,我只是想弄清楚如何为每个 div 分配一个单独的 ID,以便脚本根据它所在的循环将它们放入正确的 ID,例如运行具有内部计数的 for() 循环,然后根据循环定位不同的 id,var count = 0; for(){计数 = 计数 + 1; document.getElementById('sliding_info'+count);} 之类的。如果你能以班级为目标,生活会很好......
  • 嗯,这听起来与您在此处发布的内容完全不同。也许这需要另一个问题,或者您可以更新这个问题。
【解决方案2】:

document.getElementById()appendChild() 通常在所有主要浏览器中都能正常工作,除了 IE 交替使用 idname 的问题(可能不相关)。这里不需要 jQuery。

【讨论】:

    【解决方案3】:

    没有理由这样做。 jQuery 是 JavaScript,但具有附加功能。如果它在 JavaScript 中不起作用,则翻译后的 jQuery 也不起作用。这甚至没有提到翻译它所增加的(不必要的)工作。

    【讨论】:

    • jQuery 增加了一层浏览器兼容性。因为 OP 正在使用 DOM 操作,所以使用框架使其在所有浏览器(尤其是 IE)中工作而不会变得疯狂绝对是一个很好的目标。
    • getElementById 和 appendChild 都被所有主流浏览器支持。
    【解决方案4】:

    我不会争论你是否需要 jQuery。这不是必需品。但是,如果您确实想使用它,这就是您使用 jQuery 执行相同代码的方式:

                function calculateDateAgo(secAgo) {
                 var agoString, agoRange, agoScaled;
                 if(secAgo >= (agoRange = 60*60*24)) 
                   agoString = (agoScaled = Math.floor(secAgo/agoRange))+" "+(agoScaled>1?"days":"day") + " ago";
                 else if(secAgo >= (agoRange = 60*60))
                   agoString = (agoScaled = Math.floor(secAgo/agoRange))+" "+(agoScaled>1?"hours":"hour") + " ago";
                 else if(secAgo >= (agoRange = 60))
                   agoString = (agoScaled = Math.floor(secAgo/agoRange))+" "+(agoScaled>1?"minutes":"minute") + " ago";
                 else if(secAgo >= -60)
                   agoString = "blastin' out now";
                 else
                   agoString = "soon ;)";
                 return agoString;
                }
    
                function truncateName(name, l) {
                return name.length > l ? name.substr(0,l-2) + "\u2026" : name;
                }
    
                function lfmRecentTracks(JSONdata) {
                    try { 
                        var eImg, eLink, eSpan, divTag, eWrapper, date;
                        var oTracks = new Array().concat(JSONdata.recenttracks.track);
                        for (var i = 0; i < oTracks.length; i++) {
                            //insert coverart image
                            var spanTag  = $('<span class="lfmTrackImageCell tab_item"></span>');
                            $("body").append(spanTag);
                            if(oTracks[i].image[1]["#text"] != "") {
                                eImg = $('<img src="'+oTracks[i].image[1]["#text"]+'" class="lfmTrackImage" />');
                                spanTag.appendChild(eImg);
                            }else{
                                eImg = $('<img src="http://cdn.last.fm/flatness/icons/res/3/track.png" class="lfmTrackImageNotFound" />');
                                spanTag.appendChild(eImg);
                            }
                         }
                        for (var i = 0; i <>[lessthanhere] oTracks.length; i++) {
                          //insert track link
                            spanTag = $('<span class="lfmTrackInfoCell tabslider"><a href='+oTracks[i].url+' target="new" class="lfmTrackTitle">'+truncateName(oTracks[i].name, 25)+'</a></span>');
                            //alert(truncateName(oTracks[i].name, 25));
                            //alert(oTracks[i].url);
                            $("body").append(spanTag);
    
                            //insert artist name
                            eSpan = $('<span class="lfmTrackArtist">'+truncateName(oTracks[i].artist["#text"], 22)+'</span>');
                            //alert(truncateName(oTracks[i].artist["#text"], 22));
                            $("body").append(eSpan);
    
                            //insert date
                            date = (typeof oTracks[i].date=="undefined"?"now playing":calculateDateAgo(new Date().getTime()/1000 - oTracks[i].date.uts));
                            eSpan = $('<span class="lfmTrackDate">'+ date +'</span>');
                            spanTag.append(eSpan);
                            //alert((typeof oTracks[i].date=="undefined"?"now playing":calculateDateAgo(new Date().getTime()/1000 - oTracks[i].date.uts))); 
                            $("body").append(eSpan);
                         }
                    } catch(e) {}
                }
    

    现在,我不保证这在生产中是否有效,但它看起来是正确的。另外,我不确定你对 i &lt;&gt;[lessthanhere] oTracks.length; 部分做了什么,所以我把它留在了。通常情况下,它会是 i &lt; oTracks.length;

    【讨论】:

    • 谢谢阿德里安,我会看看它,该代码的目的是阻止 SO 在那里结束代码部分......当我输入小于时,它会出于某种原因签名。
    【解决方案5】:

    应该很简单。如果说 jQuery 擅长一件事(而且有很多),那就是 DOM 操作(即,正是你想要做的事情。)从这些教程开始

    http://docs.jquery.com/Tutorials:How_jQuery_Works

    http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery

    第二个将很好地介绍如何将 HTML 插入到文档中。之后只需查看文档的manipulation 部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 2022-09-22
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多