如何使用l()创建一个EMPTY仅锚链接?


20

我正在尝试使用l()来获取类似的信息<a href='#' ...>,以进行Ajax调用。 /programming/1698453/drupal-creating-anchor-only-link-with-l非常接近正确的东西-使用l()诸如这样的选项'fragment' => 'foo'来产生类似的链接<a href='#foo'...>-但我试图得到一个干净的“#”。有什么方法可以执行此操作,还是我应该在片段中放入一些内容而不用担心呢?

Answers:


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 2012年

1
@Serjas,javascript:javascript:void(0)一样。唯一的区别是“ void(0)” :)
Sithu 2012年

我的意思是l()将convert()吗?
Serjas 2012年

6
您永远不要使用这种恶作剧,而应该使用事件驱动的JavaScript!这是2012年,而不是2004年。为什么要对这么低质量的答案进行投票?流行是因为容易?但这是完全错误的。:(

@chx,因为您是drupal的核心维护者,所以我希望您不要滥用l()函数的第二个参数而不是路径或片段。不幸的是,该函数接受“ javascript”作为路径:)如果极其错误,为什么Drupal接受它。可能在以后的Drupal版本中会受到限制。
锡胡

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>

繁荣。我们为避免手动连接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'];
}

它检查以确保片段不是一个空字符串,这是您需要传递的字符串以获取clean #。我认为最简单的解决方案是在页面中某个位置选择合适元素的ID,然后将其用于片段(或javascript:void如Sithu所述)。

但是...最可访问的方式(以及随后在许多国家(地区)以法律方式;认为在美国的第508节,在英国的DDA等)将提供通过您的链接加载/调整的内容一个单独的页面,并使用该页面的URL作为链接的href。然后,您将使用javascript阻止链接上的事件实际重定向那些启用了该事件的浏览器的页面。

这样,您就可以为没有javascript的用户提供备用内容,可以保持合法状态,并且可以使每个人和他们的狗都开心:)


关于后备的出色编辑!如果我们在链接的href中使用ajax URL,并且在禁用javascript的情况下,调用页面可以是可呈现的HTML吗?我曾经print drupal_json_output($output)在我的ajax调用页面中使用过。
锡胡2012年

4

您不能使用clean #

但它可以添加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的特别关注。不利之处是没有快捷功能,因此我们必须使用渲染数组:

array (
  '#type' => 'html_tag',
  '#tag' => 'a',
  '#attributes' => array (
    'href' => '#',
  ),
);

0

这基本上是我在这里发布的答案...设置fragment为单个空格将转换为#,并且$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' => ' '));

无需获取路径别名,因为l()将为您转换为别名。实际上,最好使用非锯齿路径。
rooby
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.