2013-10-09 34 views
0

我試圖從一個下拉列表中選擇一個函數來調用函數..只是基本的函數更改圖像..我被告知要從傳遞數據到函數..但我無法弄清楚得到它的工作,所以我試圖使用一個if。不確定Wats錯誤?進出口新的嘗試從下拉列表中的數據調用函數

<!DOCTYPE html> 
<html> 
<head> 
    <title>Functions</title> 
</head> 
<body> 
<script> 
function myfunction(){ 
    var selection = document.getElementById('changes'); 
    var a = dropdown1.selectedIndex; 
} 

if (a==0){ 
    moveimage(); 
} 
else if (a==1){ 
    makeinvisible(); 
} 
else if (a==2){ 
    makelarger(); 
} 
else if (a==3){ 
    makesmaller(); 
} 


function moveimage(){ 
    var x = document.getElementById('image'); 
    x.style.marginTop="50px"; 
} 

function makeinvisible(){ 
    var x = document.getElementById('image'); 
    x.style.visibility="hidden"; 
} 

function makelarger(){ 
    var x = document.getElementById('image'); 
    image.width="1000"; 
    image.height="1000"; 
} 

function makesmaller(){ 
    var x = document.getElementById('image'); 
    image.width="100"; 
    image.height="100"; 
} 

</script> 

<form name="change"> 
    <img src = "cookie.jpg" id="image"> 
</br> 
<select id="changes"> 
    <option value="0" >Larger</option> 
    <option value="1">Smaller</option> 
    <option value="2">Move</option> 
    <option value="3">Invisible</option> 
</select> 
</br> 
</br> 
</br> 
</br> 

<input type=button value="Adjust Image" onchange="myfunction()"> 

</select> 

</body> 
</html> 
+0

我注意到你沒有關閉''標籤 –

回答

1

您弄丟了語言禁區右側大括號}myfunction()

function myfunction() 
{ 
    var selection = document.getElementById('changes'); 
    var a = dropdown1.selectedIndex; 
    if (a ==0) 
    { 
    moveimage(); 
    } 

    else if (a ==1) 
    { 
    makeinvisible(); 
    } 

    else if (a ==2) 
    { 
    makelarger(); 
    } 
    else if (a ==3) 
    { 
    makesmaller(); 
    } 
} 

function moveimage() 
{ 
    var x = document.getElementById('image'); 
    x.style.marginTop="50px"; 
} 
function makeinvisible() 
{ 
    var x = document.getElementById('image'); 
    x.style.visibility="hidden"; 
} 
function makelarger() 
{ 
    var x = document.getElementById('image'); 
    image.width="1000px"; 
    image.height="1000px" 
} 
function makesmaller() 
{ 
    var x = document.getElementById('image'); 
    image.width="100px"; 
    image.height="100px" 
} 
+0

謝謝,但仍然無法正常工作。有更多的錯誤..我想 –

+0

@FrancisGall查看我更新的答案:) –

+0

@Francis:出於好奇,我的答案是如何工作的?任何有利的東西? –

2

首先,你有一個錯誤在你的}放置,這消除(如已被納文說明)您的if/else塊從您的功能(導致錯誤,因爲a然後undefined在此塊評估點

此外,你的按鈕在您指定的事件處理程序的HTML,:

<input type=button value="Adjust Image" onchange="myfunction()"> 

一個的type="button"input沒有onchange/change事件;但它確實有一個click/onclick

<input type=button value="Adjust Image" onclick="myfunction()"> 

然後,你似乎已經混亂中,你打電話給你的函數的地方:

Select Shows: | selectedIndex is: | You call:  | Should (probably) call: 
-----------------+----------------------+------------------+------------------------- 
Larger   | 0     | moveImage()  | makeLarger() 
Smaller   | 1     | makeinvisible() | makesmaller() 
Move    | 2     | makelarger()  | moveimage() 
Invisible  | 3     | makesmaller() | makeinvisible() 

之後,你要調整使用節點本身的屬性:image.heightimage.width的大小(在makesmaller()makelarger()中)。這些都不是圖像的性能,但圖像的style性質的,而應該是:

image.style.width = '1000'; 
image.style.height = '1000'; 

當然,這些屬性值需要一個單位,所以你需要添加px還有:

image.style.width = '1000px'; 
image.style.height = '1000px'; 

,並提供:

function myfunction() { 
    var selection = document.getElementById('changes'); 
    var a = selection.selectedIndex; 
    if (a === 0) { 
     makelarger(); 
    } else if (a == 1) { 
     makesmaller(); 
    } else if (a == 2) { 
     moveimage(); 
    } else if (a == 3) { 
     makeinvisible(); 
    } 
} 


function moveimage() { 
    var x = document.getElementById('image'); 
    x.style.marginTop = "50px"; 
} 

function makeinvisible() { 
    var x = document.getElementById('image'); 
    x.style.visibility = "hidden"; 
} 

function makelarger() { 
    var x = document.getElementById('image'); 
    image.style.width = "1000px"; 
    image.style.height = "1000px"; 
} 

function makesmaller() { 
    var x = document.getElementById('image'); 
    image.style.width = "100px"; 
    image.style.height = "100px"; 
} 

​​。

現在,進行改進。

if/else是不必要的昂貴,你多次重新評估相同的變量。爲了節省時間,使用switch() {...}代替,曾經對變量:

switch (a) { 
    case 0: 
     makelarger(); 
     break; 
    case 1: 
     makesmaller(); 
     break; 
    case 2: 
     moveimage(); 
     break; 
    case 3: 
     makeinvisible(); 
     break; 
} 

JS Fiddle demo

隨着switch情況進行檢查(包括第一匹配案後的那些),所以break是重要的,以迫使後續檢查要被跳過,而對於switch要退出。

也沒有必要建立之前的開關(尤其是因爲你不使用它們之後)兩個變量,所以你還不如,而是簡單地做:

function myfunction() { 
    switch (document.getElementById('changes').selectedIndex) { 
     case 0: 
      makelarger(); 
      break; 
     case 1: 
      makesmaller(); 
      break; 
     case 2: 
      moveimage(); 
      break; 
     case 3: 
      makeinvisible(); 
      break; 
    } 
} 

JS Fiddle demo

此外,在線的事件處理程序(嘗試使用onchange,隨後在我的更新使用onclick)是實踐的差,因爲它會導致「突兀的JavaScript」,這是難以維持,所以我們移動事件處理程序進入的JavaScript本身,給相關的元件的id(由能夠容易地對其進行定位)後:

<input id="buttonElem" type=button value="Adjust Image" /> 

document.getElementById('buttonElem').addEventListener('click', myfunction); 

JS Fiddle demo

因爲addEventListener()沒有很好地支持IE,直到,我認爲,第10版,你可能會,但更喜歡使用(與上input相同id):

document.getElementById('buttonElem').onclick = myfunction; 

JS Fiddle demo

你也當然的,而不是維持適當的指標對功能的switch使用地圖的索引和功能的:

var funcMap = { 
    0 : makelarger, 
    1 : makesmaller, 
    2 : moveimage, 
    3 : makeinvisible 
}; 

    function myfunction() { 
     var select = document.getElementById('changes'); 
     funcMap[select.selectedIndex](); 
    } 

JS Fiddle demo

這可能允許您將不同的對象傳遞給該函數,該函數允許多個元素調用相同的函數,並根據傳入的映射調用不同的輔助函數(在這種情況下,它的用途有限)因爲你只有一個select元素調用該函數;但爲了將來使用它值得記住)。

但是,最好確保有一個函數被調用,或者是該地圖中與我們正在使用的密鑰相關的屬性;所以我們可以將之前的JavaScript改編爲:

function myfunction() { 
     var select = document.getElementById('changes'); 
     if (funcMap.hasOwnProperty(select.selectedIndex)) { 
      funcMap[select.selectedIndex](); 
     } 
    } 

JS Fiddle demo

在這一點上,當然,我們正在重複以前的錯誤,並重新評估兩次(select.selectedIndex)同樣的事情,所以不是:

function myfunction() { 
    var selected = document.getElementById('changes').selectedIndex; 
    if (funcMap.hasOwnProperty(selected)){ 
     funcMap[selected](); 
    } 
} 

JS Fiddle demo

+0

這真是一個很好的答案,您是否使用過任何東西來生成該ASCII表格? –

+0

非常感謝!不,ASCII表格純粹是通過仔細使用空格,'-','+'和'|'字符來創建的。雖然不難做。謝天謝地...... :) –