cflayout: getElementById не работает при включении в исходный файл - PullRequest
0 голосов
/ 15 августа 2011

Если я создаю макет в CF9, используя cflayout, как показано ниже:

<cfajaximport tags="cfform">
<cflayout type="border" name="example">
    <cflayoutarea position="center" name="_center" source="/example/center.cfm" />
</cflayout>

, а затем создаю файл center.cfm для включения:

<cfform name="myForm" id="myForm" action="post">
    <cfinput name="field1" type="text"><br/>
</cfform>

<script>
    ThisForm = document.getElementById('myForm');
    alert(ThisForm.id);
</script>

Я получаю ошибку:

Error processing JavaScript in markup for element cf_layoutarea_center

Но если я переместлю содержимое center.cfm в тег (и уберу параметр источника), код будет работать, как и ожидалось.Может кто-нибудь сказать мне, как я могу заставить это работать, используя файл center.cfm?Или объясните, почему это не работает?

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

Приветствия

Ответы [ 3 ]

2 голосов
/ 17 августа 2011

(Дэн уже дал ответ. Но только для того, чтобы показать, что он может работать ..)

Это хорошо сработало для меня в CF9.Я не уверен, почему добавление тегов не работает для вас.

test.cfm

<cfajaximport tags="cfform" />
<cflayout type="border" name="example">
    <cflayoutarea position="center" name="_center" source="myForm.cfm" />
</cflayout>

myForm.cfm

<html>
<head>
<script type="text/javascript">
    function myLoadFunction(){
        ThisForm = document.getElementById('myForm');
        alert(ThisForm.id);
    }
</script>
</head>
<body> 
<cfform name="myForm" id="myForm" action="post">
    <cfinput name="field1" type="text"><br/>
</cfform>
</body>
</html>
<cfset AjaxOnLoad("myLoadFunction") />
1 голос
/ 17 августа 2011

Мне показалось неправильным, что файл center.cfm должен содержать теги html, body и body, поэтому я попробовал это (комбинация решений Дэна и Ли):

Главная страница:

<html>
<head>
<script type="text/javascript">
    function myLoadFunction(){
        ThisForm = document.getElementById('myForm');
        alert(ThisForm.id);
    }
</script>
<cfajaximport tags="cfform">
</head>
<body> 
<cflayout type="border" name="example">
    <cflayoutarea position="center" name="_center" source="center.cfm" />
</cflayout>
</body>
</html>

А затем center.cfm выглядит просто:

<cfform name="myForm" id="myForm" action="post">
    <cfinput name="field1" type="text"><br/>
</cfform>
<cfset AjaxOnLoad("myLoadFunction") />

Это работает, как и ожидалось, и мы не отправляем другой HTML-тег и т. Д. В контент, который загружается через AJAX идобавлено на страницу.

1 голос
/ 15 августа 2011

Вам необходимо использовать метод AjaxOnLoad ColdFusion, чтобы отключить ваш JavaScript после завершения загрузки дочерней страницы. Вам нужно определить свою функцию следующим образом внутри center.cfm:

<script>
myLoadFunction = function(){
    ThisForm = document.getElementById('myForm');
    alert(ThisForm.id);
}
</script>

Затем в любом месте center.cfm добавьте следующий ColdFusion:

<cfset AjaxOnLoad("myLoadFunction") />

Это должно запустить myLoadFunction, как только center.cfm закончит загрузку в ваш тег cflayout.

РЕДАКТИРОВАТЬ: Adobe LiveDocs имеет раздел о том, как обрабатывать динамически включенный JavaScript.

Соответствующий раздел:

Все определения функций JavaScript на страницах, которые вы включаете динамически, например, с помощью выражения привязки, функции ColdFusion.navigate или отправки формы в теге контейнера ColdFusion Ajax, должны иметь следующий синтаксический формат: functionName = function (arguments) {тело функции}

Определения функций, использующие следующий формат, могут не работать: function functionName (arguments) {тело функции}

...