javascript - 当通过 innerHTML 添加内容时,发生不必要的滚动到元素

标签 javascript html

我需要在 javascript 中调用 ajax 后向节点插入一些 html。

我用的是framework,不过没关系。重要的事情——在 ajax 回调中插入内容:

// added filterWrapper to DOM
BX.ajax.get(
    '/get_filter_for_diagrams.php',
    {
        'sessid': BX.bitrix_sessid()
    },
    function (data)
    {
        filterWrapper.innerHTML = data;
    }
);

通过 innerHTML 添加内容后,我的窗口滚动到该元素,但我不希望出现这种行为。

我尝试制作:

window.scrollTo(0,0);

但都一样 - 滚动到元素。

如何防止滚动到元素?

更新: 生成的html

<!-- Final :: Search -->
<div class="main-ui-filter-search main-ui-filter-no-search main-ui-filter-theme-default" id="filter_diagrams_underwriters_search_container">
	<input
			type="text"
			tabindex="1"autofocus=""value=""
			name="FIND"
			placeholder="Filter"
			class="main-ui-filter-search-filter"
			id="filter_diagrams_underwriters_search"
			autocomplete="off">
	<div class="main-ui-item-icon-block">
		<span class="main-ui-item-icon main-ui-search"></span>
		<span class="main-ui-item-icon main-ui-delete"></span>
	</div>
</div>

<!--'start_frame_cache_xIeC97'-->
<script type="text/html" id="filter_diagrams_underwriters_GENERAL_template">
	<div class="main-ui-filter-wrapper main-ui-filter-value-required-mode main-ui-filter-theme-default">
		<div class="main-ui-filter-inner-container">
			<div class="main-ui-filter-sidebar">
				<div class="main-ui-filter-sidebar-title">
					<h5 class="main-ui-filter-sidebar-title-item">Filters</h5>
				</div><!--main-ui-filter-sidebar-->
				<div class="main-ui-filter-sidebar-item-container">
																		<div class="main-ui-filter-sidebar-item main-ui-hide" data-id="tmp_filter" >
								<span class="main-ui-item-icon main-ui-filter-icon-grab" title="Pull to sort the filters list"></span>
								<span class="main-ui-filter-sidebar-item-text-container">
									<span class="main-ui-filter-sidebar-item-text">Current month</span>
									<input type="text" placeholder="Filter name" value="Current month" class="main-ui-filter-sidebar-item-input">
									<span class="main-ui-item-icon main-ui-filter-icon-pin" title="Default filter"></span>
								</span>
																	<span class="main-ui-item-icon main-ui-filter-icon-pin" title="Default filter"></span>
																<span class="main-ui-item-icon main-ui-filter-icon-edit" title="Edit filter name"></span>
								<span class="main-ui-item-icon main-ui-delete" title="Delete filter"></span>
								<div class="main-ui-filter-edit-mask"></div>
							</div>
													<div class="main-ui-filter-sidebar-item main-ui-filter-current-item main-ui-hide" data-id="default_filter" >
								<span class="main-ui-item-icon main-ui-filter-icon-grab" title="Pull to sort the filters list"></span>
								<span class="main-ui-filter-sidebar-item-text-container">
									<span class="main-ui-filter-sidebar-item-text">Filter</span>
									<input type="text" placeholder="Filter name" value="Filter" class="main-ui-filter-sidebar-item-input">
									<span class="main-ui-item-icon main-ui-filter-icon-pin" title="Default filter"></span>
								</span>
																	<span class="main-ui-item-icon main-ui-filter-icon-pin" title="Default filter"></span>
																<span class="main-ui-item-icon main-ui-filter-icon-edit" title="Edit filter name"></span>
								<span class="main-ui-item-icon main-ui-delete" title="Delete filter"></span>
								<div class="main-ui-filter-edit-mask"></div>
							</div>
																<div class="main-ui-filter-sidebar-item main-ui-filter-new-filter">
						<div class="main-ui-filter-edit-mask"></div>
						<input class="main-ui-filter-sidebar-edit-control" type="text" placeholder="Filter name">
					</div>
				</div><!--main-ui-filter-sidebar-item-container-->
			</div><!--main-ui-filter-sidebar-->
			<div class="main-ui-filter-field-container">
				<div class="main-ui-filter-field-container-list">

				</div>

				<div class="main-ui-filter-field-add">
					<span class="main-ui-filter-field-add-item">Add field</span>
					<span class="main-ui-filter-field-restore-items">Restore default fields</span>
				</div><!--main-ui-filter-field-add-->
			</div><!--main-ui-filter-field-container-->
			<div class="main-ui-filter-bottom-controls">
									<div class="main-ui-filter-add-container">
						<span class="main-ui-filter-add-item">Save filter</span>
						<span class="main-ui-filter-add-edit" title="Configure filter"></span>
						<span class="main-ui-filter-reset-link">
							<span class="main-ui-filter-field-button-item">Reset to default</span>
						</span>
					</div><!--main-ui-filter-add-container-->
				
				<div class="main-ui-filter-field-preset-button-container">
					<div class="main-ui-filter-field-button-inner">
						<span class="webform-small-button webform-small-button-blue main-ui-filter-field-button main-ui-filter-find">
							<span class="main-ui-filter-field-button-item">Search</span>
						</span>
						<span class="webform-small-button webform-small-button-transparent main-ui-filter-field-button main-ui-filter-reset">
							<span class="main-ui-filter-field-button-item">Reset</span>
						</span>
					</div>
				</div>
				<div class="main-ui-filter-field-button-container">
					<div class="main-ui-filter-field-button-inner">
													<label class="main-ui-filter-field-button main-ui-filter-save-for-all" for="save-for-all">
								<input id="save-for-all" class="main-ui-filter-field-button-checkbox" type="checkbox">
								<span class="main-ui-filter-field-button-item">Apply for all users</span>
							</label>
												<span class="webform-small-button webform-small-button-accept main-ui-filter-field-button main-ui-filter-save">
							<span class="main-ui-filter-field-button-item">Save</span>
						</span>
						<span class="webform-small-button webform-small-button-transparent main-ui-filter-field-button main-ui-filter-cancel">
							<span class="main-ui-filter-field-button-item">Cancel</span>
						</span>
					</div>
				</div>
			</div><!--main-ui-filter-bottom-controls-->
		</div><!--main-ui-filter-inner-container-->
	</div><!--main-ui-filter-wrapper-->
</script>


<!--'end_frame_cache_xIeC97'-->

UPD2:在移除自动对焦的正则表达式之后(console.log 输出):

<!-- Final :: Search -->
<div class="main-ui-filter-search main-ui-filter-no-search main-ui-filter-theme-default" id="filter_diagrams_underwriters_search_container">
	<input
			type="text"
			tabindex="1"value=""
			name="FIND"
			placeholder="Filter"
			class="main-ui-filter-search-filter"
			id="filter_diagrams_underwriters_search"
			autocomplete="off">
	<div class="main-ui-item-icon-block">
		<span class="main-ui-item-icon main-ui-search"></span>
		<span class="main-ui-item-icon main-ui-delete"></span>
	</div>
</div>

<!--'start_frame_cache_xIeC97'-->
<script type="text/html" id="filter_diagrams_underwriters_GENERAL_template">
	<div class="main-ui-filter-wrapper main-ui-filter-value-required-mode main-ui-filter-theme-default">
		<div class="main-ui-filter-inner-container">
			<div class="main-ui-filter-sidebar">
				<div class="main-ui-filter-sidebar-title">
					<h5 class="main-ui-filter-sidebar-title-item">Filters</h5>
				</div><!--main-ui-filter-sidebar-->
				<div class="main-ui-filter-sidebar-item-container">
																		<div class="main-ui-filter-sidebar-item main-ui-hide" data-id="tmp_filter" >
								<span class="main-ui-item-icon main-ui-filter-icon-grab" title="Pull to sort the filters list"></span>
								<span class="main-ui-filter-sidebar-item-text-container">
									<span class="main-ui-filter-sidebar-item-text">Current month</span>
									<input type="text" placeholder="Filter name" value="Current month" class="main-ui-filter-sidebar-item-input">
									<span class="main-ui-item-icon main-ui-filter-icon-pin" title="Default filter"></span>
								</span>
																	<span class="main-ui-item-icon main-ui-filter-icon-pin" title="Default filter"></span>
																<span class="main-ui-item-icon main-ui-filter-icon-edit" title="Edit filter name"></span>
								<span class="main-ui-item-icon main-ui-delete" title="Delete filter"></span>
								<div class="main-ui-filter-edit-mask"></div>
							</div>
													<div class="main-ui-filter-sidebar-item main-ui-filter-current-item main-ui-hide" data-id="default_filter" >
								<span class="main-ui-item-icon main-ui-filter-icon-grab" title="Pull to sort the filters list"></span>
								<span class="main-ui-filter-sidebar-item-text-container">
									<span class="main-ui-filter-sidebar-item-text">Filter</span>
									<input type="text" placeholder="Filter name" value="Filter" class="main-ui-filter-sidebar-item-input">
									<span class="main-ui-item-icon main-ui-filter-icon-pin" title="Default filter"></span>
								</span>
																	<span class="main-ui-item-icon main-ui-filter-icon-pin" title="Default filter"></span>
																<span class="main-ui-item-icon main-ui-filter-icon-edit" title="Edit filter name"></span>
								<span class="main-ui-item-icon main-ui-delete" title="Delete filter"></span>
								<div class="main-ui-filter-edit-mask"></div>
							</div>
																<div class="main-ui-filter-sidebar-item main-ui-filter-new-filter">
						<div class="main-ui-filter-edit-mask"></div>
						<input class="main-ui-filter-sidebar-edit-control" type="text" placeholder="Filter name">
					</div>
				</div><!--main-ui-filter-sidebar-item-container-->
			</div><!--main-ui-filter-sidebar-->
			<div class="main-ui-filter-field-container">
				<div class="main-ui-filter-field-container-list">

				</div>

				<div class="main-ui-filter-field-add">
					<span class="main-ui-filter-field-add-item">Add field</span>
					<span class="main-ui-filter-field-restore-items">Restore default fields</span>
				</div><!--main-ui-filter-field-add-->
			</div><!--main-ui-filter-field-container-->
			<div class="main-ui-filter-bottom-controls">
									<div class="main-ui-filter-add-container">
						<span class="main-ui-filter-add-item">Save filter</span>
						<span class="main-ui-filter-add-edit" title="Configure filter"></span>
						<span class="main-ui-filter-reset-link">
							<span class="main-ui-filter-field-button-item">Reset to default</span>
						</span>
					</div><!--main-ui-filter-add-container-->
				
				<div class="main-ui-filter-field-preset-button-container">
					<div class="main-ui-filter-field-button-inner">
						<span class="webform-small-button webform-small-button-blue main-ui-filter-field-button main-ui-filter-find">
							<span class="main-ui-filter-field-button-item">Search</span>
						</span>
						<span class="webform-small-button webform-small-button-transparent main-ui-filter-field-button main-ui-filter-reset">
							<span class="main-ui-filter-field-button-item">Reset</span>
						</span>
					</div>
				</div>
				<div class="main-ui-filter-field-button-container">
					<div class="main-ui-filter-field-button-inner">
													<label class="main-ui-filter-field-button main-ui-filter-save-for-all" for="save-for-all">
								<input id="save-for-all" class="main-ui-filter-field-button-checkbox" type="checkbox">
								<span class="main-ui-filter-field-button-item">Apply for all users</span>
							</label>
												<span class="webform-small-button webform-small-button-accept main-ui-filter-field-button main-ui-filter-save">
							<span class="main-ui-filter-field-button-item">Save</span>
						</span>
						<span class="webform-small-button webform-small-button-transparent main-ui-filter-field-button main-ui-filter-cancel">
							<span class="main-ui-filter-field-button-item">Cancel</span>
						</span>
					</div>
				</div>
			</div><!--main-ui-filter-bottom-controls-->
		</div><!--main-ui-filter-inner-container-->
	</div><!--main-ui-filter-wrapper-->
</script>


<!--'end_frame_cache_xIeC97'-->

最佳答案

自动对焦属性将使控件自动对焦。因此页面将滚动到那里。

为了演示,在这个实际页面(this SO page)中,尝试执行(使用开发工具控制台)

document.getElementsByClassName('js-primary-footer-links')[0].innerHTML = "<input autofocus='' type='text'/>"

对比

document.getElementsByClassName('js-primary-footer-links')[0].innerHTML = "<input type='text'/>"

生成的内容是否也在你的控制之下? - 如果没有,您可以从返回的数据中删除该部分,然后再将其放在页面上(使用 innerHTML)

      filterWrapper.innerHTML = data.replace('autofocus=""', '');

编辑:你的新代码不再为我触发滚动,所以还有其他东西。可能在您当前页面的源代码中,或者仍在框架中。

您提供的代码示例(保存在 test.html 中并在浏览器中打开):

<html>
    <head>
        <script type="text/template" id="content">
             <!-- Put your processed HTML here, for clearity - I did not include it here-->
             <!--Your old html did trigger the scroll, your new html doesnt-->
        </script>
    </head>
    <body>
        <input type="button" onclick="load()" value="load"/>
        <div style="background-color: green; height: 100%"></div>
        <div id="diva"></div>
    </body>
</html>

关于javascript - 当通过 innerHTML 添加内容时,发生不必要的滚动到元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51043681/

相关文章:

javascript - 隐藏或显示数据属性的特定值的所有 div

javascript - 如何使元素在滚动时仅显示在容器上

javascript - 页面加载时自动加载弹出窗口

javascript - 按日期对两个表进行排序并在 html <table> 中显示输出

javascript - 将复杂的字符串转换为整数?

javascript - 如何在 Firefox 55 的 Web 扩展中获取原始响应主体?

javascript - 如何使用 NodeJS 驱动程序在 Neo4j 中链接查询,同时将一些数据合并到新属性中?

javascript - Excel 就像在 javascript 中建立索引

html - Chrome 中的 CSS 文本渲染问题

html - 没有 jquery 水平居中模态