2013-09-07 2 views
0

Я пытаюсь что-то сделать, просто для удовольствия, в результате чего я пытаюсь эмулировать подсветку синтаксиса, когда код вводится в текстовое поле на веб-странице.Эмуляция подсветки синтаксиса с помощью Javascript

Я написал небольшой скрипт JS, но он бросает ошибки. "невозможно установить свойство" цвет "неопределенного."

Для этого я создал небольшой массив из нескольких примеров «buzzwords» для поиска введенного кода. Затем я разделил строку кода на массив и зациклил на совпадения между ними. Я не знаком с методом split или действительно методом поиска. Как я могу получить какие-либо соответствия найденным для изменения цвета на экране в режиме реального времени?

function init() { 

window.setInterval(function() { 
    var code = document.getElementById("texty").value; 
    var buzzword = ["function","()","{","}","[","]",".getElementById",".getElementsByClassName",".style","$"]; 
    for(i=0; i < buzzword.length; i++) 
    { 
     var testers = code.split(" "); 
     for(i =0; i < testers.length; i++) 
     { 
      if(buzzword[i] == testers[i]) 
      { 
       code.search(testers[i]); 
       code.match(testers[i]).style.color = 'blue'; 
      } 
     } 
    } 
}, 10000); 

} 

функция init() выполнена в фокусе текстового поля.

Любая помощь будет оценена, спасибо!

+2

Произвольные строки не имеют стилей, они не являются частью DOM, они просто данные. Вы не можете применить стиль к случайной подстроке значения textarea. Код 'code.match (тестеры [i]). Style.color = 'blue';' никогда не будет работать. – meagar

+1

, продолжая то, что сказал @meagar, поэтому на веб-сайтах, которые форматируют ввод пользователя, обычно есть текстовое поле, в котором вы вводите ввод, а затем в другую область, где вы можете увидеть предварительный просмотр форматированного ввода, например текстовое поле ответа на стек и представление. – Colin

+0

это хороший момент.Любые идеи по коду, которые поймают определенные слова в текстовом поле и окрасят их в сингл в отдельном «предварительном» div? –

ответ

0

Я решил еще раз пойти на это. Спокойно, мой предыдущий ответ был сбит. Вот какой код. Я не был в состоянии jsfiddle, но я проверил его и он работает отлично:

Некоторые CSS:

<style> .blue { color: blue; } </style> 

Некоторые HTML для тестирования:

<div id="div"></div> 
<textarea id="area" onfocus="init()"> 
    function writeTo() { 
    var id = document.getElementById('id'); 
    var class = document.getElementsByClass('class'); 
    id.style.color = 'blue'; 
    var $id = $('#id'); 
    var array = []; 
    var obj = {}; 
    } 
</textarea> 

Некоторые Javascript. Это использует регулярное выражение вместо массива. Он находит/заменяет ключевые слова, обертывая их в промежутке с class="blue". Текст затем сбрасывали в ожидающей div:

function init() { 
    var area = document.getElementById('area'); 
    var div = document.getElementById('div'); 
    var buzzword = /function|.getElementById|.getElementsByClassName|.style|\{|\}|\(|\)|\$|\[|\]/g; 
    var text = area.value; 
    var replacedText = text.replace(buzzword, function (selection) { 
    return '<span class="blue">' + selection + '</span>'; 
    }); 
    div.innerHTML = replacedText; 
} 

Если вы хотите, чтобы это обновление в режиме реального времени (или каждый раз, когда пользователь вводит что-то), вы должны связать keyup событие текстового поля для запуска init каждый раз. Там больше об этом here.

Вы должны избавиться от onfocus события и добавить вместо этого:

if (window.addEventListener) { 
    document.getElementById('area').addEventListener('keyup', init, false); 
} else { 
    document.getElementById('area').attachEvent('keyup', init); 
} 

Это гарантирует, что при вводе в textarea, синтаксис окраска должна быть хорошо в div. Убедитесь, что вызов вашего Javascript находится внизу вашей HTML-страницы, а в заголовке, иначе он не узнает элемент.

+0

Спасибо @ Andy, ваш новый ответ работает хорошо! Я немного изменил свой HTML-код с тех пор, как спросил, поэтому мне пришлось немного изменить решение, но теперь это работает! Однако, когда я продолжаю печатать, текст по-прежнему остается синим. Мне нужно, чтобы только совпадающее слово было синим, а затем все, что не соответствовало, было по умолчанию. Вы знаете, как достичь этого? :) –

+0

@tinkerbot - Я обновил свой ответ. Надеюсь, код слушателя событий поможет. – Andy

+0

@tinkerbot, также проверьте, есть ли у вас какие-либо другие стили под названием 'blue' и измените класс в коде на что-то еще, если вы это сделаете. – Andy

0

Я хотел бы сделать что-то вроде этого:

var buzzwords = ['\\(\\)', 'function']; 
previewDiv.innerHTML = textarea.value.replace(new RegExp(
    '(' + buzzwords.join('|') + ')', 'g' 
), '<span style="color:blue">$1</span>'); 

Не забывайте экранировать специальные символы, используя два обратных слеша: .(){}[]$.

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