2012-10-07 73 views
-3

我有一份必須遵循的信件。請閱讀javascript代碼頂部的註釋以查看我對此作業的限制。大部分的功能都是非常好的佈局和評論,但在頁面加載時它不起作用。我已經包含了我的HTML,CSS和JavaScript。在給出答案之前,請閱讀javascript頂部的註釋,以便您的建議不會超出我的限制。對不起,如果我對這件事很生氣,我不是故意的。感謝大家的幫助。謝謝,傑森Javascript:只能使用具有功能和事件的外部文件

p.s.這是返回的唯一錯誤:

Warning: TypeError: function showTip does not always return a value 
Source File: file:///G:/WEB%20215/Moodle%20Assignments/Assignment%206/Jason_McCoy_6/js.js 
Line: 40 

HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 

<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>Tool Tips</title> 
    <link href="css.css" rel="stylesheet" type="text/css" /> 
    <script src="js.js" type="text/javascript"></script> 
</head> 

<body> 

    <h1>Tool Tips</h1> 
    <p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
    <a href="http://en.wikipedia.org/wiki/Randy_Rhoads" class="tip">Randy Rhoads 
    <span> Randy Rhoads blah blah blah</span></a>Sed tincidunt pulvinar elit, ac porta dolor feugiat. 
    <a href="http://en.wikipedia.org/wiki/Ty_Tabor" class="tip">Ty Tabor 
    <span> Ty Tabor blah blah blah</span></a>Nunc quis eros ac ante convallis pharetra. 
    <a href="http://en.wikipedia.org/wiki/Andy_Timmons" class="tip">Andy Timmons 
    <span> Andy Timmons blah blah blah</span></a>In nec justo libero, a convallis quam.</p> 

</body> 
</html> 

CSS

/* styles the anchors that have tooltips*/ 
.tip { 
    font-weight: bold; 
    border-bottom: 1px dotted #333; 
    cursor: help; 
    position: relative; 
    color: #600; 
} 

/* hides all tooltips by default on page load */ 
.tip span { 
    display: none; 
/* none of these matter now because the tooltips are hidden */ 
/* when JS unhides the tooltips, these will already be in place */ 
    position: absolute; 
    top: 1.5em; 
    left: 0; 
    background: #fff; 
    border: 1px solid #333; 
    width: 100px; 
    padding: 5px; 
    color: #333; 
} 

/* applied by JS to show tips */ 
.tip span.showTip { 
    display: block; 
} 

/* applied by JS to hide tips */ 
.tip span.hideTip { 
    display: none; 
} 

的Javascript

// *** USE JAVASCRIPT BEST PRACTICES (ALL FUNCTIONALITY COMES FROM THE EXTERNAL JAVASCRIPT FILE) *** 
// *** THIS MEANS THAT THE HTML AND THE CSS ARE NOT TO BE EDITED AT ALL *** 
// *** NO <SCRIPT> TAGS ARE TO BE ADDED TO THE HTML *** 
// *** NO INLINE JAVASCRIPT IS TO BE ADDED TO THE HTML *** 
// *** THE CSS IS TO BE LEFT ALONE, NO CHANGES ARE ALLOWED *** 
// *** CANNOT USE ANY JQUERY *** 
// *** CANNOT USE INNERHTML *** 

// Step 1: Create the ONLOAD event so that the function prepareTips() runs once the page has finished loading 
window.onload = prepareTips; 

// Step 2: Declare the prepareTips() function 
function prepareTips() { 

    // Step 3: Scan the document looking for all anchor tags 
    var arrPrepareTipsAnchors = document.getElementsByTagName('a'); 

    // Step 4: Loop thru all the anchor tags 
    for (var i=0; i<arrPrepareTipsAnchors.length; i++) { 

     // Step 5: Bind the showTip() function to the anchor tags' MOUSEOVER and ONCLICK events 
     arrPrepareTipsAnchors[i].onmouseover = arrPrepareTipsAnchors[i].onclick = function() { 
      showTip(this); 
      return false; 
     } 

     // Step 6: Bind the hideTip() function to the anchor tags' MOUSEOUT event 
     arrPrepareTipsAnchors[i].onmouseout = function() { 
      hideTip(this); 
      return false; 
     } 
    }    
} 

// Step 7: Create a separate function called showTip() 
function showTip(anchor) { 
    // Step 8: Scan the document looking for all anchor tags 
    var arrShowTipAnchors = document.getElementsByTagName('a'); 

    // Step 9: If a anchor is clicked, the default behavior is canceled (i.e. the link does nothing) 
    // Step 10: When a mouseover event occurs to an anchor: 
    // 1) The anchor's classname is changed from the default 'tip' class to the 'showTip' class as described in the CSS File 
    // 2) The anchor's 'title' attribute is changed to the text that is in between the <span> childNode of each anchor 
    for (j=0; j<arrShowTipAnchors.length; j++) { 
     if (arrShowTipAnchors[j].onclick) { 
      anchor.getAttribute('href'); 
      return false; 
     } 
     if (arrShowTipAnchors[j].onmouseover) { 
      anchor.lastChild.setAttribute('class', 'showTip'); 
      var showTooltip = anchor.lastChild.nodeValue; 
      anchor.setAttribute('title', showTooltip); 
     }  
    } 
} 

// Step 11: Create a separate function called hideTip() 
function hideTip(anchor) { 

    // Step 12: Scan the document looking for all anchor tags 
    var arrHideTipAnchors = document.getElementsByTagName('a'); 

    // Step 13: Loop thru all the anchor tags 
    for(var k=0; k<arrHideTipAnchors.length; k++) { 
     //Step 14: When a MOUSEOUT event occurs to an anchor: 
     // 1) The anchor's classname is changed from the default 'tip' class to the 'hideTip' class as described in the CSS File 
     // 2) The anchor's 'title' attribute is set to null (i.e. the tooltip that appears on the MOUSEOVER disappears on the MOUSEOUT) 
     if (arrHideTipAnchors[k].onmouseout) { 
      anchor.lastChild.setAttribute('class', 'hideTip'); 
      var hideTooltip = ""; 
      anchor.setAttribute('title', hideTooltip); 
     } 
    } 
} 

*更新的JavaScript(只是代碼添加,無評論)*

window.onload = prepareTips; 

var anchors = document.getElementsByTagName('a'); 

function prepareTips() { 

    if(!document.getElementsByTagName('a')) return false; 

    for(var i=0; i<anchors.length; i++){ 
      anchors[i].onclick = showTip; 
      anchors[i].onmouseover = showTip; 
      anchors[i].onmouseout = hideTip; 
    } 
} 

function showTip(variable) { 
    this.setAttribute('href', '#'); 
    this.classname = 'showTip'; 
    this.getAttribute('title') ? this.lastChild.nodeValue : this.lastChild.nodeValue; 
} 

function hideTip(variable) { 
    this.classname = 'hideTip'; 
    this.getAttribute('title') ? "" : ""; 
} 
+1

#1是一個Q&A網站 - 的Q代表的問題,所以有一些期望,問題實際上會問。事實並非如此 - 您還沒有告訴我們您要解決的問題是什麼,您遇到的問題是什麼等等。您已經發布了一些代碼,這是一個好的開始,並且是一個錯誤消息,這也是有用的,但仍然缺少很多信息。另外,請看代碼註釋爲步驟5和步驟6: - 它應該做什麼(基於註釋)根本不是代碼實際執行的內容。 –

+0

我的問題是:我如何獲得功能和事件的工作。截至目前,他們不工作。如何在加載頁面後單擊鏈接時不做任何事情,如何將錨標記的標題屬性更改爲鼠標懸停事件上標記之間的文本,如何獲取工具提示在鼠標事件中消失? – HoppedUpDesigns

回答

0

讓我們來看看Step 5

// Step 5: Bind the showTip() function to the anchor tags' MOUSEOVER and ONCLICK events 
if (arrPrepareTipsAnchors[i].onmouseover || arrPrepareTipsAnchors[i].onclick) { 
    arrPrepareTipsAnchors[i] = function() { 
     showTip(this); 
     return false; 
    } 
} 

現在,讓我們打破這種分解成各個部分。

開始於arrPrepareTipsAnchors[i]是一個數組元素 - 在這種情況下,它指向頁面上的一個<a>元素,該代碼在執行時沒有當前綁定的事件處理程序(由於沒有內聯事件處理程序,在HTML頁面中沒有<script>標籤等)。事件處理程序存儲爲元素的屬性,如onclick,onmouseover等。如果我們在名爲element的變量中引用元素,則element.onclick將引用onclick事件處理函數(該函數在單擊事件時運行在該元素上被解僱)。

我們也有一個if聲明,所以我們期望條件返回truefalse。在這種情況下,我們的條件是:

arrPrepareTipsAnchors[i].onmouseover || arrPrepareTipsAnchors[i].onclick 

正如我們上面所覆蓋,這些屬性參照相應的事件處理功能 - 在這種情況下,函數來執行的點擊鼠標懸停事件。但是,我們也表示它還沒有綁定任何事件處理程序,因此這兩個屬性都是undefined。就這樣,我們的條件基本上就變成了:

undefined || undefined 

在JavaScript中,undefined被認爲是「falsey」,使病情將永遠不會計算到truefalse OR false總是將是false)和身體會永遠執行。

然而,爲了完整起見,讓我們來看看if語句內的代碼:

arrPrepareTipsAnchors[i] = function() { 
    showTip(this); 
    return false; 
} 

如上,arrPrepareTipsAnchors[i]是一個數組元素 - 它包含(點)的值。但是,我們使用=(賦值)運算符,因此我們正在爲該數組元素分配一個新值。具體來說,我們正在分配一個匿名函數。

如果我們加入所有這些在一起,我們可以說,整個代碼件可正是如此描述:

如果arrPrepareTipsAnchors[i]引用的DOM元素具有任一種onclickonmouseover事件處理程序集,取代該數組中的元素具有匿名函數。

我懷疑你想要的是更接近於如下:

arrPrepareTipsAnchors[i].onmouseover = arrPrepareTipsAnchors[i].onclick = function() { 
    showTip(this); 
    return false; 
} 
相關問題