2010-02-11 4 views
2

Я пытаюсь создать форму, которая будет принимать заданный текст и направить вас к выбранной поисковой системе с текстом в качестве запроса. У меня проблемы с javascript для (re) direct.JavaScript-форму для перенаправления поисковых систем

Что интересно, если вы сделаете ввод ввода кнопкой и сделаете onClick = "searchForm", а затем нажмите на нее, она будет работать. Но тогда вы не можете набирать и просто нажмите enter, чтобы искать .. что мне нужно.

Кроме того, если есть какой-то лучший, но совершенно другой способ сделать это, я бы хотел его услышать.

Спасибо.

EDIT: Полностью изменил код в соответствии с тем, что сказал meouw, что было намного более ясным, чем то, что я изначально имел, поэтому спасибо. Я знаю, что HTML был испорчен, это было главным образом потому, что я менял все вокруг, чтобы попытаться заставить JavaScript работать. Так что даже сейчас, когда я все расчистил, у него все еще есть та же проблема.

Я знаю, что мне что-то не хватает, потому что если вы ставите предупреждение ('cat'); после изменения URL-адреса в JavaScript вы можете увидеть, что браузер был перенаправлен для выполнения поиска, но как только вы нажмете OK на предупреждение, вы получите обратно. Вы даже можете вернуться в историю своего браузера, чтобы перейти на страницу поиска.

EDIT AGAIN: Хорошо, спасибо meouw. Возвращение ложного - это то, что мне нужно было все время. Спасибо за помощь.

FINAL КОД:

<script type="text/javascript"> 
    function doSearch(f) { 
     var searchTerm = f.searchText.value; 

     if(!searchTerm) { 
      //tell user to enter a search string 
      // cancel the request by returning false 
      return false; 
     } 

     var sel = f.whichEngine; 
     var selectedEngine = sel[sel.selectedIndex].value; 
     var engineUrl; 

     switch(selectedEngine) { 
     case 'google_web': 
      engineUrl = 'http://www.google.com/search?q='; 
      break; 
     case 'bing_web': 
      engineUrl = 'http://www.bing.com/search?q='; 
      break; 
     case 'yahoo_web': 
      engineUrl = 'http://search.yahoo.com/search?p='; 
      break; 
     case 'google_images': 
      engineUrl = 'http://www.images.google.com/images?q='; 
      break; 
     case 'bing_images': 
      engineUrl = 'http://www.bing.com/images/search?q='; 
      break; 
     case 'yahoo_images': 
      engineUrl = 'http://images.search.yahoo.com/search/images?p='; 
      break; 
     } 

     engineUrl += searchTerm; 
     window.location.assign(engineUrl); 
     return false; 
    } 

</script> 
<form onsubmit="return doSearch(this)"> 
    <fieldset> 
     <legend>Search</legend> 
     <ul> 
      <li> 
       <input type="text" name="searchText" id="searchText" size="41" maxlength="2048" /> 
      </li> 
      <li> 
       <select name="whichEngine" id="whichEngine"> 
        <optgroup label="Web"> 
         <option id="GoogleWeb" value="google_web" checked="checked">Google Web</option> 
         <option id="BingWeb" value="bing_web">Bing Web</option> 
         <option id="YahooWeb" value="yahoo_web">Yahoo! Web</option> 
        </optgroup> 
        <optgroup label="Images"> 
         <option id="GoogleImages" value="google_images">Google Images</option> 
         <option id="BingImages" value="bing_images">Bing Images</option> 
         <option id="YahooImages" value="yahoo_images">Yahoo! Images</option> 
        </optgroup> 
       </select> 
       <input type="submit" value="Search"> 
      </li> 
     </ul> 
    </fieldset> 
</form> 
+0

Вы, вероятно, следует начать, запустив валидатор над вашей разметкой - '' Элементы не могут содержать ничего, кроме опций; ярлык и элементы запрещены. – Quentin

+0

Возвратите false в конце doSearch(), чтобы форма никогда не отправлялась – meouw

+0

Я изменил свой ответ, извините – meouw

ответ

1

Ваша главная проблема заключается в

window.location.assign(finalSearchString); 

должен быть

window.location = finalSearchString;

window.location.href = finalSearchString; 

Другие вещи:

Ваша разметка нечетно
Вам нужно return выход вашей функции к onsubmit формы в случае, если вы хотите, чтобы отменить поиск.
Вам не нужны метки и ссылки в параметрах - вместо того, чтобы иметь теги с закрытием тега, поместите текст в параметр и дайте опции значение, которое может быть прочитано вашим скриптом. Это безопаснее, если вы придете к добавлению больше опций позже

<form onsubmit="return doSearch(this)"> 
.... 
<optgroup label="Google"> 
    <option value="google_search">Google Web</option> 
    <option value="google_images">Google Images</option> 
</optgroup> 
.... 
</form> 

<script type="text/javascript"> 

function doSearch(f) { 
    var searchTerm = f.searchText.value; 

    if(!searchTerm) { 
     //tell user to enter a search string 
     // cancel the request by returning false 
     return false; 
    } 

    var sel = f.whichEngine; 
    var selectedEngine = sel[sel.selectedIndex].value; 
    var engineUrl; 

    switch(selectedEngine) { 
     case 'google_search': 
      engineUrl = 'http://www.google.com/search?q='; 
      break; 
    .... 
    } 

    engineUrl += searchTerm; 
    window.location.href = engineUrl; 

} 

</script> 
+0

Я все еще думаю window.location.assign (engineUrl); лучше, чем window.location.href, потому что люди говорят, что могут вызвать ошибки перенаправления при использовании кнопки «Назад» или window.location.replace(), потому что она перезаписывает историю того, с чего вы ее вызвали. Трудно сказать, потому что в Интернете мало что о window.location.assign(). – SirDinosaur

+0

Я никогда не использовал assign() tbh - даже документы W3C по адресу http://www.w3.org/TR/Window/#location-methods оставили описание пустым - некоторые люди обнаружили, что он перенаправляет по отношению к src файла js. Используйте его, если он работает в вашем случае tho :) – meouw

0

Вы хотите отправить форму для поиска с указанным адресом, не так ли?

Замените эту строку кода:

function startSearch(){ 
    // ................... 
    // ................... 
    // ................... 

    window.location.assign(finalSearchString); 
} 

С:

function startSearch(){ 
    // ................... 
    // ................... 
    // ................... 

    if (finalSearchString) 
    { 
    document.searchForm.action = finalSearchString; 
    document.serachForm.submit(); 
    return true; 
    } 
    else 
    { 
    return false; 
    } 

И, наконец, изменить свою form тег к этому:

<form name="searchForm" onSubmit="return startSearch();"> 
+0

Если вы отправляете непосредственно движку, вам также нужно убедиться, что имя вашего поискового запроса соответствует ожидаемому движку - то есть «q» - это может быть не так для всех например, http://www.wolframalpha.com/ использует «i», Yahoo использует «p» – meouw

+0

@meouw: что? это состоит из функции внутри переменной finalSearchString – Sarfraz

+0

. Таким образом, вы получаете сообщение www.google.com/search?q=cat?seachText=cat&whatEver=blah - вы видите проблему? url is borked – meouw

Смежные вопросы