Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ifame выделение создать ссылку 
:(
    Опции темы
Frozen_Coyote
Дата 6.10.2011, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 20.9.2007

Репутация: нет
Всего: нет



Здравствуйте,

подскажите пжалуйста, задача меня уже месяц третирует - я не знаю как ее решить несмотря на кучу советов - подскажите плиз, как грамотнее все реализовать

все очень просто по смыслу, но в силу моего какого то очевидного незнания, для меня - очень сложно. я тут вывесил два поста - за исключением очень редких (спасибо вам, друзья) ответов - это сплошные музеи: все тихо заходят, тихо смотрят и тихо уходят. Инкремент счетчика накручивается - толку нет. 

Оставим лирику, вернемся к проблеме:

Есть редактируемый ифрэйм. Мне нужно из выделения сделать ссылку. При этом ссылку сделать вместе с css классом. По этой причине execcommand createlink не подходит, хотя он отлично создает ссылки. Что в нем хорошо: если выделяешь текст  в несколько параграфов - этот метод у каждого параграфа создает отдельный блок a href. НО БЕЗ КЛАССОВ! А классы применить к данной ссылке нужно как и наличие самой ссылки так сказать, без классов никуда. Остается два видимо приемлимых варианта (давайте на примере хрома, я знаю, как метод вставки HTML работает в разных браузерах  - это пока неважно)

1. с помощью insertHTML. Все бы хорошо, но при обертывании выделенного фрагмента текста и вставкой его в ифрэйм вокруг образуются лишние теги, <p><a href=''><p>выделенный текст</p></a></p> Это не есть гуд, ибо хотелось бы валидность соблюдать. Пытался предварительно удалять текст и deleteContents() и execcommand.delete - что опера что гугл на месте удаления оставляют какой то мусор - типа <p><br /></p> - соответсвенно следующая вставка - нарушается валидность.
 
2. с помощью вышеозначенного execcommand.createLink(идеальный метод, именно по прчиине отдельной ссылки для каждого из параграфов) но с возвращением выделения на созданную ссылку, опять создания выделения на ней, обхода всех элементов, поиска тэга А и присваивания ему аттрибута class с помощью setAttribute.

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

я готов оплатить помощь в решении данной проблемы ибо у меня уже реально поддувает под панаму от такого трындеца...

спасибо
PM MAIL   Вверх
magelan
Дата 7.10.2011, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 2
Всего: 16



1. неплохо выложить пример, где вы с помощью экзеккомманд делаете ссылки без классов (вот ей богу ломает писать несколько html-ек с нуля), архивы к форуму пристегивается.

2. вам точно надо класс у ссылок? они нескольких классов в вашем редакторе? может достаточно правильно цсс написать типа .editableBlock A {...} ?

Проблемы которые вы поднимаете - решаются, как я вам уже писал либо регексом, либо вы умеете двигать каретку и гулять по блокам текста в стиле MS Word. Либо изображаете из себя анализатор текста, что медленее, но более понятно для обычных людей.

Еще можно подумать на тему хаков, ставить не ссылку, а какой-нибудь спан с вашим классом, после этого все равно надо либо регекс, либо вы обходите все дерево отыскивая свои "уникальные" спаны и меняя их аналогом outerHTML.

Собственно именно ваши проблемы мешают сообществу написать полноценный бесплатный визивиг.

P.$ как вариант хака -  можно ставить какую нибудь лихую ссылку типа "my-protocol://forum.vingrad.ru", потом прощупывать все A на предмет такой ссылки, цеплять им класс, менять протокол на http.

Это сообщение отредактировал(а) magelan - 7.10.2011, 13:31
PM MAIL   Вверх
Apelsin
Дата 9.10.2011, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 20.4.2009

Репутация: 1
Всего: 1



Добавляйте нужный css класс в исходный код вашего iframe и применяйте к выделенному тексту нужный тег + класс.

Проблема, на сколько я понял, бегло прочитав ваше сообщение, в том, что в iframe не видно классов основной страницы.
PM MAIL   Вверх
Frozen_Coyote
Дата 11.10.2011, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 20.9.2007

Репутация: нет
Всего: нет



Рассказываю, что мне необходимо:

администратор сайта, к примеру ставит некий материал на сайт - новость. И вот в новости ему допустим надо все фамилии мужчин сделать зеленой ссылкой, а женщин - красной. Поэтому в моем редакторе при оформлении ссылки предварительн можно выбрать некий класс, который пойдет параметром при превращении текста в линк. Поэтому задача в теории проста: выделяется текст, указываются параметры (урл, названия класса и нажимается ОК

Понеслось. Текст конвертируется в ссылку, (выделение охраняется) далее javascript обходит все ссылки на странице циклом (есть ли другой способ?) и если очередная ссылка входит в пользовтельский selection - сеттит атрибут class. Вот так

Ребят,

я изрядно продвинулся в своих сражениях в этом вопросе - и победил Хром, Оперу Фаер и Сафари (см. ниже) -  остался ИЕ

Код

iDoc.execCommand("createLink", false, url);
            var sel = document.getElementById(iframe_id).contentWindow.getSelection();
            var rng = sel.getRangeAt(0);
            rng.setStartBefore(rng.startContainer.parentNode);
            rng.setEndAfter(rng.endContainer.parentNode);
            var links = rng.commonAncestorContainer.getElementsByTagName("a");

            for (var i = 0; i < links.length; i++)
            {
                var linkRange = document.getElementById(iframe_id).contentWindow.document.createRange();
                linkRange.selectNode(links[i]);
                if (rng.compareBoundaryPoints(Range.START_TO_START, linkRange) <= 0 && rng.compareBoundaryPoints(Range.END_TO_END, linkRange) >= 0)
                {
                    links[i].setAttribute("class", classname);
                }
            }


с ИЕ же затык вот в чем - не могу понять как заставит его проверять - входит ли очередной линк в пользовательское выделение (см. код)

как узнать - принадлежит ли некий узел страницы пользовательскому выделению? если справлюсь с этим - можно скзаать что победа

Код

remRange.select();
iDoc.execCommand("createLink", false, type + "://" + url);


var links = remRange.parentElement().getElementsByTagName("a");

for (var i = 0; i < links.length; i++)
{
    var linkRange = iDoc.selection.createRange();
    linkRange.moveToElementText(links[i]);
//ТУТ НАДО КАКИМ ТО ОБРАЗОМ ПРОВЕСТИ ПРВОЕРКУ НА НАЛИЧИЕ ТЕКУЩЕЙ НОДЫ В ПОЛЬЗОВАТЕЛЬСКОМ ВЫДЕЛЕНИИ
//И ЕСЛИ ОНА ТАМ ЕСТЬ - СООТВЕСТВЕННО СЕТТИТЬ АТТРИБУТ    
links[i].setAttribute("class", classname);
}



PM MAIL   Вверх
Frozen_Coyote
Дата 11.10.2011, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 20.9.2007

Репутация: нет
Всего: нет



Уффффф.. ну вроде победа.. Враг бежит... smile)) ура smile)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0604 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.