Где установить тег на баннер с текстовым контейнером [дубликат]

Маршрутизатор P / Invoke предположит, что память для типа возврата была выделена CoTaskMemAlloc () и вызовет CoTaskMemFree (), чтобы освободить его. Если это не было сделано, программа потерпит неудачу с исключением в Vista и Win7, но без проблем протекает память на XP. Использование SysAllocString () может быть выполнено для работы, но вы должны аннотировать тип возвращаемого значения в атрибуте [DllImport]. Не делать этого все равно вызовет утечку, без диагностики на Win7. BSTR является not указателем на блок памяти, выделенный CoTaskMemAlloc, перед указанным адресом есть 4 байта, которые хранят размер строки.

Любой из следующих комбинации будут работать правильно:

  extern «C» __declspec (dllexport) BSTR __stdcall ReturnsAString () {return SysAllocString (L «Hello world»);  } [DllImport (@ "c: \ projects \ cpptemp1 \ debug \ cpptemp1.dll")] [return: MarshalAs (UnmanagedType.BStr)] // ПРИМЕЧАНИЕ: требуется!  частная статическая внешняя строка ReturnsAString ();   

Или:

  extern «C» __declspec (dllexport) const wchar_t * __stdcall ReturnsAString () {const wchar_t * str = L «Hello world»;  wchar_t * retval = (wchar_t *) CoTaskMemAlloc ((wcslen (str) +1) * sizeof (wchar_t));  wcscpy (retval, str);  return retval;  } [DllImport (@ "c: \ projects \ cpptemp1 \ debug \ cpptemp1.dll", CharSet = CharSet.Auto)] частная статическая внешняя строка ReturnsAString ();   

Вы должны подумать о том, чтобы позволить клиентскому коду передать буфер, чтобы не было проблем с управлением памятью. Это должно выглядеть так:

  extern «C» __declspec (dllexport) void __stdcall ReturnsAString (wchar_t * buffer, size_t buflen) {wcscpy_s (буфер, buflen, L "Hello world")  ;  } [DllImport (@ "c: \ projects \ cpptemp1 \ debug \ cpptemp1.dll", CharSet = CharSet.Auto)] private static extern void ReturnsAString (буфер StringBuilder, int buflen);  ... StringBuilder sb = new StringBuilder (256);  ReturnsAString (sb, sb.Capacity);  string s = sb.ToString ();   
33
задан denislexic 27 March 2012 в 04:16
поделиться

6 ответов

Прямо от W3C для HTML4:

12.2.2 Вложенные ссылки являются незаконными

Ссылки и привязки, определенные элементом A, не должны быть вложенными ; элемент A не должен содержать никаких других элементов A.

Поскольку DTD определяет элемент LINK как пустой, элементы LINK могут также не вставляться.

HTML 5

И для HTML5 это немного отличается .

Вы не можете иметь интерактивный контент внутри элемента A. Интерактивное содержимое содержит теги привязки.

45
ответ дан Josh 15 August 2018 в 21:20
поделиться
  • 1
    Спасибо за ссылки, очень информативные и прямые! FWIW, хотя он недействителен, каждый проверенный мной браузер (Firefox 26, Chrome 34, IE8 +) на самом деле позволяет вам вставлять теги ссылок без каких-либо последствий - не были введены неявные закрывающие теги. Это, конечно, спорный вопрос - я думаю, что UX с вложенными ссылками, ведущими к разным URL-адресам, настолько трудно понять, что это никогда не должно быть сделано. – Jon z 10 February 2014 в 20:00
  • 2
    Просто уточнить: теги привязки HTML5 не могут содержать метки привязки, даже теги привязки, которые не являются интерактивным содержимым (т. Е. Привязывающие теги без атрибута href). – fzzfzzfzz 19 May 2017 в 15:03
  • 3
    @Jonz быстро переадресует несколько лет - версия Chrome 59.0.3071.115 на Mac настраивает HTML, если якорь встроен в другой привяз ... – ngoue 10 July 2017 в 18:35

Вложенные ссылки являются незаконными. Чтобы добиться такого же поведения, как и в вложенных ссылках, вы можете сделать следующее:

Использовать HTML-формат @mikevoermans, как показано ниже, и связать событие click

<div class="sp_mngt_bar">
    <h1><a href="#"<?php echo $v; ?></a></h1>
    <a href="#" class="t_icons t_icons_settings sp_mngt_settings"></a>
    <a href="#" class="t_icons t_icons_move sp_mngt_move"></a> 
</div>

Ваше событие click должно выглядеть так: это:

$(".sp_mngt_bar").bind("click", function(e) {   
    var target = $(e.target);
    if(target.has('.t_icons_settings') { //Do something for settings } 
    else if(target.has('.t_icons_move') { //Do something for move }
    else { //Do something for sp_mngt_bar
});
1
ответ дан Epuri 15 August 2018 в 21:20
поделиться

Вот чистое решение html / css:

HTML

<div class="block">
  <a class="overlay" href="#overlay-link"></a>
  <div class="inner">
    This entire box is a hyperlink. (Kind of)<br><br><br><br>
    <a href="#inner-link">I'm a W3C compliant hyperlink inside that box</a>
  </div>
</div>

CSS

.block {
  position:relative;
}

.block .overlay {
  position:absolute;
  left:0; top:0; bottom:0; right:0;
}

.block .inner {
  position:relative;
  pointer-events: none;
  z-index: 1;
}

.block .inner a {
  pointer-events: all;
}

https://codepen.io / pwkip / ручка / oGMZjb

8
ответ дан Jules Colle 15 August 2018 в 21:20
поделиться
  • 1
    Отлично. Спасибо, что отправил код. Мне особенно нравится, как это действительный html. – Millar248 18 May 2018 в 19:36
  • 2
    Блестящее решение - если бы я мог дать это более 1 upvote, я бы! – Steve Eynon 3 August 2018 в 17:49

Я бы переделал его так, чтобы он был больше похож на этот формат:

<div class="sp_mngt_bar">
    <h1><a href="#"<?php echo $v; ?></a></h1>
    <a href="#" class="t_icons t_icons_settings sp_mngt_settings"></a>
    <a href="#" class="t_icons t_icons_move sp_mngt_move"></a>
</a>
4
ответ дан mikevoermans 15 August 2018 в 21:20
поделиться
  • 1
    В элементах a должно быть некоторое содержимое. Хотя формально правильный, пустой a элемент плохо подходит для доступности. (Я полагаю, идея состоит в том, что у них есть настройки CSS, включая фоновое изображение, но это плохо для доступности). – Jukka K. Korpela 27 March 2012 в 05:52
  • 2
    Почему для доступности существует пустой элемент? Я часто использую это для сокращения запросов HTML и для спрайтов. – denislexic 27 March 2012 в 09:08

Хотя я полностью согласен с выбранным ответом и да, вы не должны иметь интерактивный контент внутри элемента A, иногда вам может понадобиться обходной путь.

Вот например, где вам необходимо поместить интерактивный элемент внутри тега A. Эта маленькая кнопка закрытия в правом верхнем углу.

Вот HTML для этого. (Это не фактическая сборка, я сделал ее немного проще)

<a href="#">
    <span class="hide">X</span> <!-- THIS IS THE SMALL 'X' WHICH HIDES THE WHOLE BOX -->
    <img src="images/camera.svg" width="50" alt="Camera" />
    <em>
        Upload a profile picture
        <small>
            Here's the deal. Make your profile look awesome and even get 25 karma for it. We're not kidding.
        </small>
    </em>
    <strong>
        + 25 K
    </strong>
</a>

Итак, в основном мы хотим скрыть это поле, когда пользователь нажимает на «X». В противном случае, он должен работать как простой тег A. Вот jQuery, который сделал трюк.

$('.hide').click(function(e) {
        e.preventDefault();
        e.stopPropagation(); // THIS IS THE KEY PART

        // DO WHATEVER YOU WANT, I FADED OUT THE BOX FOR EXAMPLE
        $(this).parent().fadeOut(300);

    });

Надеюсь, это поможет кому-то с той же проблемой. ;)

1
ответ дан omgitsdrobinoha 15 August 2018 в 21:20
поделиться

Оберните свою вложенную ссылку внутри тега объекта:

<a href="#" class="sp_mngt_bar">
    <h1><?php echo $v; ?></h1>
    <object><a href="#" class="t_icons t_icons_settings sp_mngt_settings"></a></object>
    <object><a href="#" class="t_icons t_icons_move sp_mngt_move"></a></object>
</a>
11
ответ дан pbenard 15 August 2018 в 21:20
поделиться
  • 1
    Даже если он недействителен в html, он выполняет свою работу ... – pbenard 31 January 2017 в 21:21
  • 2
    Я бы посоветовал проверить вашу производительность после применения этого взлома. Мы добавили его в приложение, и когда-то позже выяснилось, что наш счет в списке страниц снизился. Оказывается, что обертывание ссылок вроде этого было причиной в нашем случае. – Sasha Kastsiushkin 15 March 2017 в 18:34