Как найти/обнаружить какую-либо текстовую область на странице с помощью jQuery?

Основы malloc ()

В Linux есть два типичных способа запроса памяти: sbrk и mmap . Эти системные вызовы имеют серьезные ограничения на частые небольшие выделения. malloc () - это библиотечная функция для решения этой проблемы. Он запрашивает большие куски памяти с помощью sbrk / mmap и возвращает маленькие блоки памяти внутри больших кусков. Это гораздо более эффективно и гибко, чем прямой вызов sbrk / mmap.

K & amp; R malloc ()

В реализации K & amp; R ядро ​​ (чаще называемое арена ) представляет собой большой кусок памяти. morecore() запрашивает ядро ​​из системы через sbrk(). Когда вы вызываете malloc () / free () несколько раз, некоторые блоки в ядре используются / выделяются, а другие свободны. K & amp; R malloc хранит адреса свободных блоков в циклическом единственном связанном списке. В этом списке каждый узел является блоком свободной памяти. Первые sizeof(Header) байтов сохраняют размер блока и указатель на следующий свободный блок. Остальные байты в свободном блоке неинициализированы. В отличие от типичных списков в учебниках, узлы в свободном списке являются лишь указателями на некоторые неиспользуемые области в ядрах; Вы фактически не выделяете каждый узел, кроме ядер. Этот список является ключом к пониманию алгоритма.

Следующая диаграмма показывает пример схемы памяти с двумя ядрами / аренами. На диаграмме каждый символ занимает sizeof(Header) байтов. @ представляет собой Header, + отмечает выделенную память и - отмечает свободную память внутри ядер. В примере есть три выделенных блока и три свободных блока. Три свободных блока хранятся в круговом списке. Для трех выделенных блоков только их размеры хранятся в Header.

            This is core 1                             This is core 2

@---------@+++++++++@++++++++++++        @----------@+++++++++++++++++@------------
|                                        |                            |
p->ptr->ptr                              p = p->ptr->ptr->ptr         p->ptr

В вашем коде freep является точкой входа в свободный список. Если вы несколько раз будете следовать freep->ptr, вы вернетесь к freep - оно круговое. Как только вы поймете круговой односвязный список, остальное сравнительно легко. malloc() находит свободный блок и, возможно, разбивает его. free() добавляет свободный блок обратно в список и может объединить его с соседними свободными блоками. Они оба пытаются сохранить структуру списка.

Другие комментарии по реализации

  • В комментариях к коду упоминается «обтекание» в malloc(). Эта строка происходит, когда вы прошли весь свободный список, но не можете найти свободный блок, превышающий запрошенную длину. В этом случае вам нужно добавить новое ядро ​​с morecore().

  • base - это блок нулевого размера, который всегда включен в свободный список. Это хитрость, чтобы избежать специального корпуса. Это не является строго необходимым.

  • free() может показаться немного сложным, поскольку для объединения недавно освобожденного блока с другими свободными блоками в списке необходимо рассмотреть четыре разных случая. Эта деталь не так важна, если вы не хотите переопределить ее сами.

  • Этот пост в блоге объясняет K & amp; R malloc более подробно.

PS: K & amp; R malloc - один из самых элегантных фрагментов кода на мой взгляд. Когда я впервые понял код, это действительно открыло глаза. Мне грустно, что некоторые современные программисты, даже не понимая основ этой реализации, называют шедевр дерьмом исключительно на основании его стиля кодирования.

6
задан system PAUSE 5 June 2009 в 14:12
поделиться

7 ответов

if( $('textarea').length > 0 ) {
    ...
}
8
ответ дан 8 December 2019 в 03:54
поделиться
if($('textarea').length > 0) {
    document.write('we have at least one textarea');
}

ИЛИ

if($('textarea').length) {
    document.write('we have at least one textarea');
}

Прочтите это из FAQ:

http://docs.jquery.com/Frequent_Asked_Questions#How_do_I_test_whether_an_element_exists.3F

7
ответ дан 8 December 2019 в 03:54
поделиться

Чтобы расширить ответ karim79.

Со страницы jQuery docs : Примечание: не всегда необходимо проверять, существует ли элемент. Следующий код покажет элемент, если он существует, и ничего не сделает (без ошибок) в противном случае.

Это означает, что вы можете просто сделать:

$(function(){
    $("textarea").each(function(i){
        this.enableTinyMCE();
    })
})

Изменить:

На самом деле существует плагин jQuery разрабатывается для этой цели. Я бы загрузил и опробовал плагин и, если сможете, внесу свой вклад в его разработку.

jq-tinyMCE

4
ответ дан 8 December 2019 в 03:54
поделиться

Я сделал следующее, как было предложено, однако я все еще хочу вызывать enableTinyMCE только в том случае, если на моей странице есть текстовые поля. Я не могу вызвать эту функцию в document.ready. Смотрите Google! Есть идеи?

$(function() {

     if ($('textarea').length > 0)
    {
       var data = $('textarea');
       $.each(data, function(i)
       {
         tinyMCE.execCommand('mceAddControl', false, data[i].id);
       }
       );
    }

});

function enableTinyMCE()
{
        tinyMCE.init({
            plugins: 'paste',
            theme_advanced_toolbar_location: 'top',
            theme_advanced_buttons1: 'pastetext,pasteword,copy,cut,separator,bold,italic,underline,separator,bullist,numlist,separator,undo,redo,separator,link,unlink,separator,charmap,separator,formatselect,separator,code',
            theme_advanced_buttons2: '',
            theme_advanced_buttons3: '',
            mode: 'textareas',
            theme: 'advanced',
            theme_advanced_blockformats: 'None=p,Heading 3=h3,Heading 2=h2'
        });
}

tinymce.init нужно вызывать вне documentready, но $ ('textarea'). Length всегда равно нулю за пределами documentready. Помогите!

1
ответ дан 8 December 2019 в 03:54
поделиться

Селектор jQuery всегда возвращает массив, даже если совпадающие элементы не найдены. Это означает, что вам нужно проверить длину. Попробуйте вместо этого.

if($('textarea').length > 0) {    
 document.write('we have at least one textarea');
}
2
ответ дан 8 December 2019 в 03:54
поделиться

Это мое решение

if ($('textarea').length > 0)
    {
       var data = $('textarea');
       $.each(data, function(i)
       {
         tinyMCE.execCommand('mceAddControl', false, data[i].id);
       }
       );

       $('form').bind('form-pre-serialize', function(e) {
            tinyMCE.triggerSave(true,true);
        });
    }

И чтобы включить tinyMCE, я сделал это

<% if (ViewData["TextAreaVisible"] != null && bool.Parse(ViewData["TextAreaVisible"].ToString()) == true)
   {%>
        <script type="text/javascript" src="../../Scripts/tinymce/tiny_mce.js"></script>
        <script type="text/javascript">
           enableTinyMCE();
        </script>
<%} %>

EnableTinyMCE делает это

function enableTinyMCE() {

    tinyMCE.init({
        plugins: 'paste',
        theme_advanced_toolbar_location: 'top',
        theme_advanced_buttons1: 'pastetext,pasteword,copy,cut,separator,bold,italic,underline,separator,bullist,numlist,separator,undo,redo,separator,link,unlink,separator,charmap,separator,formatselect,separator,code',
        theme_advanced_buttons2: '',
        theme_advanced_buttons3: '',
        mode: 'none',
        theme: 'advanced',
        theme_advanced_blockformats: 'None=p,Heading 3=h3,Heading 2=h2'
    });

}

0
ответ дан 8 December 2019 в 03:54
поделиться

Стоит отметить, что функции, которые вы ищете, могут обрабатываться самим TinyMCE:

Если вы установите для параметра mode значение textareas ] в вашем вызове tinyMCE.init (), он автоматически преобразует любые найденные текстовые поля в экземпляры редактора. Если текстовых полей нет, он ничего не сделает.

tinyMCE.init({
    ...
    mode : "textareas",
    ...
});

И наоборот, вы можете указать TinyMCE преобразовывать только текстовые поля, соответствующие имени класса CSS, используя значение specific_textareas в режим . параметр.

tinyMCE.init({
   ...
   mode : "specific_textareas",
   editor_selector : "mceEditor"
});

http://wiki.moxiecode.com/index.php/TinyMCE:Configuration/mode

5
ответ дан 8 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: