2015-06-23 4 views
2

У меня есть кнопка (якорный тег), которая отправляет подтверждение, если вы нажмете его. Проблема в том, что, например, если вы нажмете ее 5 раз очень быстро, она отправит 5 подтверждающих сообщений, если вы нажмете ее 2 раза, она отправит 2 сообщения.Coldfusion - Как предотвратить множественные щелчки?

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

Как я могу управлять этой ситуацией? Я, однако, отключил кнопку, но по другим причинам это невозможно.

<a class="msg" href="/manage/conversations.cfm?destination=#destination#"> 
     #ucase(request.l('Send'))# 
</a> 

Спасибо за ваше время

+0

Вы говорите о кнопке и показываете привязную метку. Пожалуйста, устраните несоответствие. –

+0

@DanBracuk вот он :) – WiTHS4UC3

+1

Почему это помечено как ColdFusion? Это проблема с клиентской стороной. –

ответ

7

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

Однако, чтобы решить проблему с UI, вы можете напрямую связать функцию вместо файла cf.

<a class="msg" href="javascript: processLink(#destination#);"> 
     #ucase(request.l('Send'))# 
</a> 

<script> 
runCount = 0; 

function processLink(destination){ 
runCount++; 

if (runCount == 1){ 
window.location.href = "/manage/conversations.cfm?destination=" + destination; 
} 

} 
</script> 
+0

Да, но не делайте 'runCount' локальной переменной функции, или значение всегда будет« 1 ». – Leigh

+0

@Leigh Хороший улов .. Я обновил код, чтобы отразить ваш комментарий. –

-2

Самый лучший способ, чтобы отключить ссылку раз он выбран. Если вы не хотите этого делать, альтернативой является структурирование conversations.cfm, как это.

<div id="pageContent"> 
small amount of text 
</div> 
<cfflush> 
</body> 
</html> 

<cfsavecontent variable = "actualPageContent"> 
code 
</cfsavecontent> 

<cfoutput> 
<script> 
var #toScript(actualPageContent, "newPageContent")#; 
document.getElementById("pageContent").innerHTML = "newPageContent"; 
</script> 
</cfoutput> 
+3

Это самый запутанный способ решить простой вопрос пользовательского интерфейса. –

2

Как уже упоминалось в предыдущем ответе, это хорошо иметь некоторую клиентскую сторону Javascript, чтобы остановить дублированных от триггерных счастливых пользователей, однако вы должны также сделать эту сторону проверки сервера.

Одним из подходов было бы создание скрытого поля формы с идентификатором GUID, который генерирует coldfusion, когда coldfusion отображает вашу форму.

Так что-то вроде:

<cfset GUID = createUUID()> 

<cfoutput> 
<form id="frm" action="/target.cfm" method="post"> 
<input type="hidden" name="guid" value="#GUID#"> 
<!-- all your formfields go here --> 
<input type="submit"> 
</form> 
</cfoutput> 

На стороне сервера целевой страницы проверяет, если он ранее уже получили GUID. Есть много способов сделать, вот два из многих способов.

a) Сфера применения.

Это, вероятно, самый быстрый способ, если вы не работаете в кластерной среде и вам просто нужно что-то быстрое для крошечного приложения.

<cfif isDefined("session.MYPAGE_GUID") AND session.MYPAGE_GUID EQ form.guid> 
<cfoutput>Duplicate Form Submission</cfoutput> 
<cfabort> 
<cfelse> 
<cfset session.MYPAGE_GUID = form.guid> 
<!-- Do Business Logic Here --> 
</cfif> 

b) Используйте таблицу базы данных. Создайте таблицу базы данных с столбцом с именем GUID. Убедитесь, что GUID является первичным ключом или имеет уникальное ограничение.

Перед тем, как запустить свою бизнес-логику, вставьте форму.GUID в таблицу базы данных. Если вы можете выполнить процесс вставки вашей бизнес-логики, если запрос базы данных не выдает ошибку, которая существует в записи. Затем вы можете уловить эту ошибку и предпринять соответствующие действия для дублирования представления.

Я предпочитаю вариант базы данных, поскольку он работает в кластерных средах, а сервер базы данных устойчив к условиям гонки, чтобы гарантировать, что GUID установлен только один раз.

Обратите внимание, что это просто демонстрирует основные понятия и не является падением в решении. Есть немного больше работы, чтобы превратить эти концепции в решение для электронной коммерции.