2

The following code is inspired by http://ignorethecode.net/blog/2010/04/20/footnotes/: when you move the cursor over the footnote symbol, the footnote is shown as a tool-tip.

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>footnote demo</title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
</head>
<body>

<p>Baryonyx was a theropod dinosaur of the early Cretaceous Period, about 130–125 million years ago<a href="#fn1" class="footnoteRef" id="fnref1"><sup>1</sup></a>. An identifying specimen of the genus was discovered in 1983 in Surrey, England; fragmentary specimens<a href="#fn2" class="footnoteRef" id="fnref2"><sup>2</sup></a> were later discovered in other parts of the United Kingdom and Iberia. Meaning "heavy claw", Baryonyx refers to the animal's very large claw (31 cm or 12 in) on the first finger. The 1983 specimen<a href="#fn3" class="footnoteRef" id="fnref3"><sup>3</sup></a> is one of the most complete theropod skeletons from the UK, and its discovery attracted media attention.</p>

<div class="footnotes">
<hr>
<ol>
<li id="fn1"><p>Baryonyx caught and held its prey primarily with its strong forelimbs and large claws.<a href="#fnref1">↩</a></p></li>
<li id="fn2"><p>The creature lived near bodies of water, in areas where other theropod, ornithopod, and sauropod dinosaurs have also been found. <a href="#fnref2">↩</a></p></li>
<li id="fn3"><p>It had a long, low, bulbous snout and narrow, many-toothed jaws, which have been compared to gharial jaws.<a href="#fnref3">↩</a></p></li>
</ol>
</div>

<script>
var removeElements = function(text, selector) {
    var wrapped = $("<div>" + text + "</div>");
    wrapped.find(selector).remove();
    return wrapped.html();
}

var $fRef = $(".footnoteRef");
for(var i=0; i<$fRef.length; i++) {
    var sup = $fRef.children("sup")[i];
    //var sup = $fRef[i].children("sup");
    //var sup = $fRef.eq(i).children("sup");
    //var sup = $fRef.get(i).children("sup");
    //var sup = $($fRef[i]).children("sup");
    //debugger;
    sup.setAttribute('fnID',i);
    sup.onmouseover = function(event) {
        var fnTip = document.getElementById('fnTip');
        if(fnTip) fnTip.parentNode.removeChild(fnTip);
        var pTip = document.createElement('div');
        var fnT = document.getElementById($fRef[this.getAttribute('fnID')].getAttribute("href").substring(1)).innerHTML;
        pTip.innerHTML = removeElements(fnT,"a");
        pTip.id = 'fnTip';
        pTip.style.position = 'absolute';
        pTip.style.left = (event.pageX - 180) + 'px';
        pTip.style.top = (event.pageY + 20) + 'px';
        pTip.style.width = '360px';
        pTip.style.textIndent = '2em';
        pTip.style.textAlign = 'left';
        pTip.style.backgroundColor = '#FFFFE0';
        pTip.style.border = '1px solid #636363';
        pTip.style.padding = '5px';
        pTip.style.fontSize = '12px';
        pTip.style.lineHeight = '1.8';
        pTip.style.borderRadius =  '5px';
        document.body.appendChild(pTip);
    };

    sup.onmouseout = function(event) {
        var fnTip = document.getElementById('fnTip');
        if(fnTip) fnTip.parentNode.removeChild(fnTip);
    };
}

</script>

</body>
</html>

My question is that the line var sup = $fRef.children("sup")[i]; seems should be var sup = $fRef[i].children("sup");, or following .children() does not work on specified index of jquery return . However, those ways (lines in the code are commented) are all not working. Please explain why var sup = $fRef.children("sup")[i]; is working, and others are not working?

Chen Deng-Ta
  • 155
  • 1
  • 7
  • The uncommented one works because the jQuery `.children()` *method* will gather all the children of all the matched elements into a single collection, so you're grabbing the `i` in that collection. It'll therefore work reliably ***as long as*** there's exactly one `sup` per `footnotRef`. –  Sep 18 '16 at 13:34
  • 1
    Your title and code do not match... – epascarello Sep 18 '16 at 13:39
  • Sorry that I know little of JS, what do you suggest for a new title? If possible, I will edit the title. – Chen Deng-Ta Sep 18 '16 at 13:45

1 Answers1

1
  1. var sup = $fRef.children("sup")[i];
    takes the ith element in the collection of children of $fRef;
    All the other methods deals with the ith element of the $fRef collection:

  2. var sup = $fRef[i].children("sup");
    tries to call the function children on the ith element of the jQuery collection $fRef, but that element is a classic Dom Element so it doesn't have any children method.

  3. var sup = $fRef.eq(i).children("sup");
    does the same thing as 2 but correctly as eq will return a jQuery object. It retrieves all the children of the ith element of $rFref

  4. var sup = $fRef.get(i).children("sup");
    The get method does the same as the index: it gets the dom object so it won't work either.

  5. var sup = $($fRef[i]).children("sup");
    will also work as 3 as you rewrap the html collection in a dom element. It's really unefficient though

mplungjan
  • 169,008
  • 28
  • 173
  • 236
Axnyff
  • 9,213
  • 4
  • 33
  • 37