Как создать ПУСТОЙ якорную ссылку только с l ()?

20

Я пытаюсь использовать l()что-то вроде <a href='#' ...>, для целей вызова ajax. /programming/1698453/drupal-creating-anchor-only-link-with-l очень близок к правильной вещи - используйте опцию в l()like, 'fragment' => 'foo'чтобы создать ссылку вроде <a href='#foo'...>- но я пытаясь получить чистый '#'. Есть ли способ сделать это, или я должен просто вставить что-то как часть фрагмента и не беспокоиться об этом?

Джим миллер
источник

Ответы:

12

Если вы не можете использовать чистую "#" с фрагментом, я бы предложил вам использовать <a href="javascript:">link</a>.
При добавлении «javascript:» или «javascript: void (0)» к hrefатрибуту <a>тег ничего не будет делать. Затем вы можете привязать «onclick» к ссылке для вашей цели ajax.
Вы можете реализовать это с помощью l()функции, как показано ниже:

     l('link', 'javascript:',  array('external' => TRUE));
Ситху
источник
как насчетjavascript:void(0)
Serjas
1
@ Сержас, javascript:и javascript:void(0)так же. Единственная разница - "void (0)" :)
Sithu
Я имею в виду l () convert ()?
Serjas
6
Вы никогда не должны использовать такие махинации и просто использовать событийный JavaScript! Это 2012 год, а не 2004 год. Почему за столь низкое качество ответа проголосовали? Популярные потому что это легко? Но это крайне неправильно. :(
@chx, поскольку вы являетесь сопровождающим ядра drupal, я надеюсь, что вы не злоупотребляете тем, что используете второй параметр функции l () вместо пути или фрагмента. К сожалению, функция принимает «javascript» в качестве пути :) Если это крайне неправильно, почему Drupal принимает это. Возможно, это будет ограничено в более поздних версиях Drupal.
Sithu
15

PHP типизирует время поп-викторины! (Полное раскрытие: я не выиграл в нашем офисе).

Как уже отмечалось, это код, l()который нас интересует:

if (isset($options['fragment']) && $options['fragment'] !== '') {
  $options['fragment'] = '#' . $options['fragment'];
}

Итак, вот вопрос: какое значение приводится к пустой строке, но передает следующее?

(isset($var) && $var !== '')

Ответ: FALSE!

Итак, мы можем попробовать это:

l(t('My link'), NULL, array('fragment' => FALSE));

Что дает нам:

<a href="/#">My link</a>

К счастью, мы можем убрать эту ведущую косую черту, передавая external => TRUE:

l(t('My link'), NULL, array('external' => TRUE, 'fragment' => FALSE));

Что дает нам:

<a href="#">My link</a>

Boom. Что мы делаем, чтобы избежать конкатенации строк html вручную, а?

Постскриптум:

Я не уверен, что на самом деле рекомендую напечатать такую ​​ссылку с php при нормальных обстоятельствах. Без вашего javascript все, что эта ссылка сделает , переместит вашего пользователя в верхнюю часть страницы ( что, к моему небольшому удивлению, является специфическим поведением ). Вероятно, это должно указывать на то, что работает без JavaScript.

Если ссылка действительно имеет смысл только с javascript (например, с элементами управления для слайд-шоу только для js или чего-то еще), я думаю, что лучше добавить ссылку на страницу с помощью javascript. В качестве альтернативы, если вы действительно хотите поместить его в свой источник, убедитесь, что он установлен display:noneпо умолчанию. У Drupal есть .jsкласс в html, который затем показывает его, когда есть javascript.

Стивен Твиддейл
источник
7

К сожалению, url()функция (которая l()вызывает внутренне) практически уничтожает любой шанс пустого фрагмента следующими строками:

if (isset($options['fragment']) && $options['fragment'] !== '') {
  $options['fragment'] = '#' . $options['fragment'];
}

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

Однако ... наиболее доступным способом (а впоследствии и во многих странах легальным путем, например, раздел 508 в Штатах, DDA в Великобритании и т. Д.) Будет предоставление контента, который загружается / корректируется по вашей ссылке на отдельную страницу, и вместо этого используйте URL для этой страницы в качестве ссылки. Затем вы должны использовать javascript, чтобы остановить событие на ссылке от фактического перенаправления страницы для тех браузеров, у которых она включена.

Таким образом, у вас есть запасной контент для пользователей без javascript, вы сохраняете законность и делаете всех и их собаку счастливыми :)

Клайв
источник
Отличная редакция про запасной вариант! Если мы используем URL-адрес ajax в href ссылки, может ли вызывающая страница быть отображаемым HTML, если javascript отключен? Я когда-либо имел print drupal_json_output($output)на своей странице вызова ajax.
Ситху
4

Вы не можете использовать чистый #.

Но можно добавить space symbolпосле #:

  l('Link title', '# ', array('external' => TRUE));
Мильковский
источник
2

У меня просто была та же проблема, но ни одно из решений не было удовлетворительным, поэтому я придумал свое собственное:

l('link', '', array('fragment' => ' ', 'html' => TRUE, 'external' => TRUE));

Это производит чистый #

<a href="#">link</a>
Дэвид Сидлер
источник
Закрыть, это производит <a href="# ">link</a>для меня.
tyler.frankenstein
1

Вместо этого я бы использовал тип рендеринга html_tag, потому что, как мне кажется, ссылка на рендер привлекает особое внимание от Drupal. Недостатком является то, что для него нет функции быстрого доступа, поэтому нам придется использовать массив render:

array (
  '#type' => 'html_tag',
  '#tag' => 'a',
  '#attributes' => array (
    'href' => '#',
  ),
);
Jigarius
источник
0

Это в основном тот же ответ, который я разместил здесь ... Установка fragmentодного пробела преобразует в a #и $current_pathвключена, потому что в противном случае ссылка будет просто установлена www.example.com/#вместо www.example.com/current-page#:

$current_path = check_url(drupal_get_path_alias($_GET['q']));
$link = l('link', $current_path, array('fragment' => ' '));
jerdiggity
источник
Нет необходимости получать псевдоним пути, потому что l () преобразует для вас псевдоним. На самом деле предпочтительнее использовать путь без псевдонимов.
Роби