2013-09-05 2 views
3

Я относительно новичок в мире программирования. У меня крепкое знание HTML и CSS, а недавно я получил JavaScript. Я работаю над серией текстовых генераторов в качестве школьного проекта; моя цель состоит в том, чтобы на веб-сайте нажмите кнопку и компьютер выплевывает случайный текст каждый раз, когда вы нажимаете кнопку. Однако, хотя я хорошо разбираюсь в HTML и JavaScript, мои знания о том, как объединить эти два, чтобы обеспечить функциональность веб-страницы, практически отсутствуют.Как сделать кнопку повторно используемой?

Я создал «генератор шекспировских оскорблений» с использованием JavaScript, который является функциональным, и я выяснил, как добавить кнопку на страницу, чтобы при нажатии кнопки она печатала случайно созданное оскорбление на странице:

<script> 
var adjective1 = ["artless", "bawdy", "beslubbering"... 
var adjective2 = ["base-court", "bat-fowling", "beef-witted"... 
var noun = ["apple-john", "baggage", "barnacle"... 

var insult = "Thou art a " + adjective1[Math.floor(Math.random() * 60)] + ", " + adjective2[Math.floor(Math.random() * 60)] + ", " + noun[Math.floor(Math.random() * 60)] + "!"; 

var genInsult = function() { 
x=document.getElementById("replace"); 
x.innerHTML=insult;  
}; 
</script> 

<p id= "replace">Your insult will appear here!</p> 
<button type="button" onclick="genInsult()">Generate Insult</button> 

Однако, как только вы нажимаете кнопку один раз, вы не можете нажать ее еще раз, чтобы создать другое оскорбление, если вы не обновите страницу.

Итак, мой вопрос: как я могу сделать эту кнопку многоразовой с помощью JavaScript?

Я попытался найти ответ на свой вопрос, но проблема в том, что я настолько новичок в JavaScript, что мне часто не удается понять вопросы других людей и ответы на них. Кроме того, многие ответы ссылаются на jQuery, язык, который я не знаю. Если у кого-то есть решение в рамках JavaScript, я был бы чрезвычайно благодарен!

Возможно, я не знаю, как много нового, но я очень хочу учиться!

+1

Примечание стороны, вы можете заменить 60 с adjective1.length – cgatian

+0

ДА ... только что ... фиксированный – CynicalPassion63

ответ

3

Переместить это:

var insult = "Thou art a " + adjective1[Math.floor(Math.random() * 60)] + ", " + adjective2[Math.floor(Math.random() * 60)] + ", " + noun[Math.floor(Math.random() * 60)] + "!"; 

в вашей genInsult() функции, и вы должны быть хорошо. Сейчас он снаружи, поэтому он будет генерировать только один раз.

+0

Это работало отлично! Спасибо, так много за помощь! :) Ты потрясающий – CynicalPassion63

0

Как уже говорилось, основная проблема заключается в том, что создание оскорбления вне вашей функции, поэтому оно создается только один раз, а не каждый раз, когда вызывается функция. Мне очень нравится код повторного факторинга, я хотел бы предложить вам следующее: (click here for live demo)

Я написал ваше приложение с использованием объектно-ориентированного шаблона и очистил много беспорядка и неэффективности. Я думаю, вам будет очень полезно изучить это и узнать все, что вы можете! Кстати, никогда не используйте встроенный javascript (функция click в вашем html), если вы не используете фреймворк, который его понимает (например, AngularJS).

<p id="insult">Your insult will appear here!</p> 
<button type="button" id="generate">Generate Insult</button> 

и ЯШ:

var generator = { //only one global variable!! 
    init: function() { //this sets up your app for use 
    var elem = document.getElementById('insult'); 

    var obj = this; //cache reference to the generator object (the "this" pointer will be changed within the click function 
    var button = document.getElementById('generate'); 
    button.addEventListener('click', function() { 
     elem.innerText = obj.generateInsult(); 
    }); 
    }, 
    generateInsult: (function() { //use an IIFE to give a nice closure to these variables 
    var generateInsult = function() { 
     return "Thou art a "+adjs1[r(adjs1)]+", "+adjs2[r(adjs2)]+", "+nouns[r(nouns)]+"!"; 
    }; 
    function r(arr) { 
     return Math.floor(Math.random() * arr.length); 
    } 
    var adjs1 = ["artless", "bawdy", "beslubbering"]; 
    var adjs2 = ["base-court", "bat-fowling", "beef-witted"]; 
    var nouns = ["apple-john", "baggage", "barnacle"]; 
    return generateInsult; 
    }()) 
}; 

generator.init(); //I suggest running this on document ready to be sure the elements are loaded. If not, this will not work. Keep that in mind! 
+0

Хорошая работа! Моя единственная nitpick: я знаю, что часть идеи этого закрытия состоит в том, чтобы предотвратить инициализацию этих массивов не один раз, но разве это не слишком много для новичков? Это также означает, что вертикальный порядок строк не совсем соответствует фактическому порядку, который он выполняет, поэтому даже аматорные кодеры могут немного запутаться, читая это. Если вы хотите изменить его, я бы также подумал о том, чтобы дать 'r()' более описательное имя, хотя я признаю, что делает функцию генерации более продолжительной. – Katana314

+0

Маленький вопрос: причина, лежащая в основе имени 'r()', так же, как вы сказали, - сохранить утверждение return понятным. Я подумал, что это случайность и имеет достаточный смысл. Также довольно ясно, что он просто смотрит на него. Возможно, вы пропустили мою точку с закрытием.Больше ничего не нужно знать о массивах или случайной функции, поэтому они являются частными для 'generateInsult()'. Он неплохо показывает намерение кода. Здесь действительно нет порядка запуска, но даже если бы мой рисунок суммировал вещи, а затем расширялся на них. Это помогает читаемости. – m59

+0

Это как сказать - что будет делать мой код? Добавьте кнопку щелчка на кнопку, которая генерирует оскорбление. Это первое, что вы видите в моем коде. Это довольно интуитивно. Затем вы можете исследовать функцию 'generateInsult()' и посмотреть сводку того, что она делает ... затем исследуйте эти вещи дальше. Сначала я пишу поток, а последние детали. – m59

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