Преобразование Straight JS в JQuery - PullRequest
3 голосов
/ 24 января 2011

Я пытаюсь добавить некоторые данные JSON из API last.fm,

Я использовал 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 каждый цикл должен ссылаться на отдельный элемент,

Заранее спасибо! Myles

EDIT:

HTML код: </p> <pre><code> <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>

Ответы [ 5 ]

1 голос
/ 24 января 2011

Я не спорю, нужен ли вам 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 <>[lessthanhere] oTracks.length;, поэтому я оставил его там. Обычно это было бы i < oTracks.length;.

1 голос
/ 24 января 2011

вместо

document.body.appendChild( ... );

попросите вашу функцию найти <div>, где вы хотите добавить контент, например:

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

(Сделайте уверенным , что на странице есть только один элемент с таким значением "id" !! Кроме того, ради IE, убедитесь, что name не является атрибутом "name" на что угодно.)

Тогда вы сможете сделать это:

targetDiv.appendChild( whatever );
1 голос
/ 24 января 2011

Нет причин делать это. JQuery - это JavaScript, но с дополнительной функциональностью. Если это не работает в JavaScript, переведенный jQuery также не будет работать. Это даже не упоминание о добавленной (ненужной) работе по ее переводу.

1 голос
/ 24 января 2011

document.getElementById() и appendChild() в целом работают нормально во всех основных браузерах, за исключением (вероятно, не относящейся к делу) проблемы с IE, использующей id и name взаимозаменяемо.JQuery здесь не нужен.

0 голосов
/ 24 января 2011

Это должно быть довольно просто. Если есть одна вещь, в которой jQuery хорош (а их много), это манипулирование DOM (то есть именно то, что вы пытаетесь сделать). Начните с этих руководств

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

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

Второй даст вам хорошее введение во вставку HTML в документ. После этого просто ознакомьтесь с разделом манипуляции документации.

...